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