java基础47 装饰着模式设计

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

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

posted @ 2018-07-11 16:41  DSHORE  阅读(257)  评论(0编辑  收藏  举报