1、装饰者模式

增强一个类的功能,而且还可以让这些装饰类相互装饰

2、装饰者设计模式的步骤

1.在装饰类的内部维护一个被装饰类的引用
    2.让装饰者有一个共同的父类或者父接口

3、实例

  1 package com.dhb.file;
  2
  3 import java.io.BufferedReader;
  4 import java.io.File;
  5 import java.io.FileReader;
  6 import java.io.IOException;
  7 import java.io.Reader;
  8
  9 /**
 10  * @author DSHORE / 2018-7-11
 11  *
 12  */
 13 /*
 14  * 装饰者模式:增强一个类的功能,而且还可以让这些装饰类相互装饰
 15  *
 16  *装饰者设计模式的步骤:
 17  * 1.在装饰类的内部维护一个被装饰类的引用
 18  * 2.让装饰者有一个共同的父类或者父接口
 19  *
 20  * 需求1:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有行号.
 21  * 需求2:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有分号.
 22  * 需求3:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有双引号.
 23  * 需求4:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有行号+分号.
 24  * 需求5:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有分号+双引号.
 25  * 需求6:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有双引号双引号+行号.
 26  * 需求7:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有行号+分号+双引号.
 27  *
 28  * 注:如果要实现需求4到7,用装饰者模式对应的调用下面的三个方法即可
 29  * */
 30
 31 //带双引号
 32 class BufferedQuto3 extends BufferedReader{//2.让装饰者有一个共同的父类或者父接口   BufferedReader
 33     public BufferedQuto3(Reader in) {//new BufferedSemi3()
 34         super(in);
 35     }
 36     @Override
 37     public String readLine() throws IOException {
 38         String line=super.readLine();
 39         if(line==null){
 40             return null;
 41         }
 42         line="\""+line+"\"";
 43         return line;
 44     }
 45
 46 }
 47 //带分号
 48 class BufferedSemi3 extends BufferedReader{//2.让装饰者有一个共同的父类或者父接口   BufferedReader
 49     //1.在装饰类的内部维护一个被装饰类的引用  (注:如果想要两个或多个类相互装饰,那么就在对应的类上也写上第一步)
 50     BufferedReader bufferedReader;
 51     public BufferedSemi3(BufferedReader bufferedReader) {//=New BufferedLineNum3()
 52         super(bufferedReader);
 53         this.bufferedReader=bufferedReader;
 54     }
 55     @Override
 56     public String readLine() throws IOException {
 57         String line=bufferedReader.readLine();//super 改成了 bufferedReader,因为需要用到带行号的方法;如果还是用super的话,那么调用的是父类BufferedReader,而父类没有带行号的方法。
 58         if(line==null){
 59             return null;
 60         }
 61         line=line+";";
 62         return line;
 63     }
 64 }
 65 //带行号
 66 class BufferedLineNum3 extends BufferedReader{//2.让装饰者有一个共同的父类或者父接口   BufferedReader
 67     int count=1;
 68     public BufferedLineNum3(Reader in) {
 69         super(in);
 70     }
 71     @Override
 72     public String readLine() throws IOException {
 73         String line=super.readLine();
 74         if(line==null){
 75             return null;
 76         }
 77         line=count+" "+line;
 78         count++;
 79         return line;
 80     }
 81 }
 82 //主方法
 83 public class Demo19 {
 84     public static void main(String[] args) throws IOException {
 85         File file=new File("F:\\MyJavaCode\\Demo20.java");
 86         FileReader fr=new FileReader(file);
 87         //BufferedReader br=new BufferedReader(fr);
 88         //带行号的缓冲输字符入流
 89         BufferedLineNum3 bln=new BufferedLineNum3(fr);
 90         //带分号的缓冲输入字符流
 91         BufferedSemi3 bs=new BufferedSemi3(bln);
 92         //带双引号的缓冲输入字符流
 93         BufferedQuto3 bq=new BufferedQuto3(fr);
 94         String line=null;
 95         while((line=bs.readLine())!=null){
 96             System.out.println(line);
 97         }
 98         bs.close();
 99     }
100 }

运行结果图

附录

释:下面的例子没有用到装饰着模式,如果要实现需求4到7的话,那么需要再写一个专门的类,比较繁杂。或者在主方法里面多些几个while循环。

 1 package com.dhb.file;
 2
 3 import java.io.BufferedReader;
 4 import java.io.File;
 5 import java.io.FileReader;
 6 import java.io.IOException;
 7 import java.io.Reader;
 8
 9 /**
10  * @author DSHORE / 2018-7-11
11  *
12  */
13 /*
14  * 需求1:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有行号.
15  * 需求2:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有分号.
16  * 需求3:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有双引号.
17  * 需求4:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有行号+分号.
18  * 需求5:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有分号+双引号.
19  * 需求6:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有双引号双引号+行号.
20  * 需求7:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有行号+分号+双引号.
21  * */
22
23 //带双引号
24 class BufferedQuto extends BufferedReader{
25     public BufferedQuto(Reader in) {//new BufferedSemi()
26         super(in);
27     }
28     @Override
29     public String readLine() throws IOException {
30         String line=super.readLine();
31         if(line==null){
32             return null;
33         }
34         line="\""+line+"\"";
35         return line;
36     }
37 }
38 //带分号
39 class BufferedSemi extends BufferedReader{
40
41     public BufferedSemi(Reader in) {//=New BufferedLineNum()
42         super(in);
43     }
44     @Override
45     public String readLine() throws IOException {
46         String line=super.readLine();
47         if(line==null){
48             return null;
49         }
50         line=line+";";
51         return line;
52     }
53 }
54 //带行号
55 class BufferedLineNum extends BufferedReader{
56     int count=1;
57     public BufferedLineNum(Reader in) {
58         super(in);
59     }
60     @Override
61     public String readLine() throws IOException {
62         String line=super.readLine();
63         if(line==null){
64             return null;
65         }
66         line=count+" "+line;
67         count++;
68         return line;
69     }
70 }
71 //主方法
72 public class Demo20 {
73     public static void main(String[] args) throws IOException {
74         File file=new File("F:\\MyJavaCode\\Demo20.java");
75         FileReader fr=new FileReader(file);
76         //BufferedReader br=new BufferedReader(fr);
77         //带行号的缓冲输字符入流
78         BufferedLineNum bln=new BufferedLineNum(fr);
79         //带分号的缓冲输入字符流
80         BufferedSemi bs=new BufferedSemi(fr);
81         //带双引号的缓冲输入字符流
82         BufferedQuto bq=new BufferedQuto(fr);
83         String line=null;
84         while((line=bq.readLine())!=null){
85             System.out.println(line);
86         }
87         bln.close();
88     }
89 }

运行结果图

原创作者:DSHORE

作者主页:http://www.cnblogs.com/dshore123/

原文出自:https://www.cnblogs.com/dshore123/p/9295335.html

欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

转载于:https://www.cnblogs.com/dshore123/p/9295335.html

java基础47 装饰着模式设计相关推荐

  1. Java 设计模式之装饰者模式

    一.了解装饰者模式 1.1 什么是装饰者模式 装饰者模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰者来包裹真实的对象. 所以装饰者可以动 ...

  2. java中的装饰者模式[63]

    java中的装饰者模式[63] 文章目录 java中的装饰者模式[63] 一.什么是装饰者模式? 二.装饰者模式要点 三.代码演示 四.小结 一.什么是装饰者模式? **1.意图:**动态的给一个对象 ...

  3. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  4. java装饰模式_Java装饰者模式实例详解

    本文实例讲述了Java装饰者模式.分享给大家供大家参考,具体如下: 装饰模式 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 装 ...

  5. Java 8的装饰器模式

    在最近的一篇文章中,我描述了装饰器模式如何拯救了我的一天. 我给出了一个小代码段,其中包含创建装饰器的最简单方法,但承诺Java 8会有更好的方法. 这里是: 用Java 8装饰 HyperlinkL ...

  6. Java常用设计模式————装饰者模式

    引言 装饰者模式,又叫装饰器模式.它可以动态的将新功能附加到对象上.在对象功能扩展方面,它比继承更灵活,同时装饰者模式也体现了OCP原则. 在客户端调用使用了装饰者模式的对象时,就好像在使用构造器层层 ...

  7. java设计模式之 装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...

  8. Java设计模式之三--装饰者模式

    转载出处:http://blog.csdn.NET/lmj623565791/article/details/24269409 今天继续设计模式之旅,给大家带来装饰者模式,国际惯例,先看定义. 装饰者 ...

  9. Java 设计模式之装饰器模式

    装饰器模式用于给原有对象增加新功能的场景, 拿食物冰淇淋,香草巧克力作为例子,给冰淇淋加香草,或者加巧克力,或者加香草和巧克力. 首先定义一个食物接口: /*** 装饰类和被装饰类共同继承的抽象类* ...

  10. java设计模式之装饰者模式

    为什么80%的码农都做不了架构师?>>>    定义:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 特点: ...

最新文章

  1. 充电类型一二次检测过程及充电类型
  2. 机器学习系列(8)_读《Nature》论文,看AlphaGo养成
  3. ruby学习笔记(2)-chomp,chop的区别
  4. 【STM32】ESP8266模块简介
  5. 大话设计模式—外观模式
  6. 批量改名_手把手教你用Python批量给图片添加水印 | 知了干货分享
  7. output在delete中的应用
  8. C语言程序的开发过程
  9. 《遥感原理与应用》孙家抦版知识点总结(含简答题、论述题)——第八章
  10. 游戏安全02:手游外挂简单分类和实现原理介绍
  11. 美国大学计算机信息技术专业排名,新鲜出炉 2019年USNews美国大学信息技术管理专业排名榜单!...
  12. c语言坐标反算方位角函数,反三角函数/简易正反算or方位角转度分秒
  13. vue-seamless-scroll 无缝滚动 使用方法
  14. python字典程序题_Python练习:字典
  15. python画素描画_基于python实现把图片转换成素描
  16. 红外循迹TCRT5000 舵机SG90
  17. 画思维导图的三招十八式
  18. bigemap软件功能
  19. 如何注册安全邮箱?- 企业电子邮件域名。
  20. 微社区项目开发笔记(后端篇)

热门文章

  1. pythonATM,购物车项目实战_补充4-db模块
  2. mysql--实战1--查询数据1--scan方法
  3. python-gui-pyqt5的使用方法-1
  4. LINUX 版本信息查看(全)
  5. ipsec在企业网中的应用(IKE野蛮模式)(转)
  6. hdu 1811 Rank of Tetris 并查集+拓扑排序
  7. Perl5中19个最重要的文件系统工具
  8. linux软件包管理rpm
  9. 一个大数据批量插入和更新的问题
  10. 推荐一本书(Secure Coding Standard for Java)