装饰者模式:增强一个类的功能,而且还可以让这些装饰类互相装饰。
装饰者设计模式的步骤:
1.在装饰类的内部维护一个被装饰类的引用。
2.让装饰类有一个共同的父类或者是父接口。
需求1:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有行号。
需求2:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有分号。
需求3:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有双引号。
需求4:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有行号 + 分号。
需求5:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有分号 + 双引号。
需求6:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有行号 + 双引号。
需求7:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有行号 + 分号 + 双引号。
继承实现的增强类和修饰模式实现的增强类有何区别?
继承实现的增强类:
优点:代码结构清晰,而且实现简单
缺点:对于每一个的需要增强的类都要创建具体的子类来帮助其增强,这样会导致继承体系过于庞大。
修饰模式实现的增强类:
优点:内部可以通过多态技术对多个需要增强的类进行增强,可以使这些装饰类达到互相装饰的效果。使用比较灵活。
缺点:需要内部通过多态技术维护需要增强的类的实例。进而使得代码稍微复杂。
package com.cn.model;import java.io.BufferedReader;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.io.Reader;/*** Author:Liu Zhiyong(QQ:1012421396)* Version:Version_1* Date:2016年7月29日12:34:18* Desc:装饰者模式:增强一个类的功能,而且还可以让这些装饰类互相装饰。需求1:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有行号。需求2:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有分号。需求3:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有双引号。需求4:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有行号 + 分号。需求5:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有分号 + 双引号。需求5:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有行号 + 双引号。需求6:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有行号 + 分号 + 双引号。 。。。-----------|Reader-----------------|BufferedReader----------------------|BufferedReaderLineNum 带行号----------------------|BufferedReaderLineSemicolon 带分号----------------------|----------------------|。。。。。 很多很多自己写的类增强一个类的功能的时候我们可以选择使用继承: 通过继承实现增强一个类的功能 优点:代码结构清晰,通俗易懂。 缺点:使用不灵活, 会导致继承的体系过于庞大。*///需求1:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有行号。class BufferedReaderLineNum extends BufferedReader{ //行号 int count = 1; public BufferedReaderLineNum(Reader in) { super(in); } @Override public String readLine() throws IOException { String readLine = super.readLine(); if(readLine == null){ return null; } readLine = count + " " + readLine; //因为加了行号,readLine加了行号肯定不为null,所以前面就要开始判断,如果为空就返回空 count++; return readLine; } }//需求2:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有分号。class BufferedReaderLineSemicolon extends BufferedReader{ public BufferedReaderLineSemicolon(Reader in) { super(in); // TODO Auto-generated constructor stub } @Override public String readLine() throws IOException { String content = super.readLine(); if(content == null) return null; content += "\t;"; System.out.println(); return content; } }//需求3:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有双引号。class BufferedReaderQuote extends BufferedReader{ public BufferedReaderQuote(Reader in) { super(in); // TODO Auto-generated constructor stub } @Override public String readLine() throws IOException { String content = super.readLine(); if(content == null) return null; content = "\"" + content + "\""; System.out.println(); return content; } }public class Demo1 { public static void main(String[] args) throws IOException { //找到目标文件 File file = new File("src\\com\\cn\\model\\Demo1.java"); //建立数据的输入通道 FileReader fileReader = new FileReader(file); /* //建立带行号的输入缓冲字符流 BufferedReaderLineNum bf = new BufferedReaderLineNum(fileReader);*/ /* //建立带分号的输入缓冲字符流 BufferedReaderLineSemicolon bf = new BufferedReaderLineSemicolon(fileReader);*/ //建立带双引号的输入缓冲字符流 BufferedReaderQuote bf = new BufferedReaderQuote(fileReader); String readLine = null; while((readLine = bf.readLine()) != null){ System.out.println(readLine); } }}
使用装饰者设计模式来增强类Demo1
package com.cn.model;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;/*** Author:Liu Zhiyong(QQ:1012421396)* Version:Version_1* Date:2016年7月29日16:15:02* Desc:装饰者模式:增强一个类的功能,而且还可以让这些装饰类互相装饰。装饰者设计模式的步骤: 1.在装饰类的内部维护一个被装饰类的引用。 2.让装饰类有一个共同的父类或者是父接口。 需求1:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有行号。需求2:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有分号。需求3:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有双引号。需求4:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有行号 + 分号。需求5:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有分号 + 双引号。需求6:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有行号 + 双引号。需求7:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有行号 + 分号 + 双引号。继承实现的增强类和修饰模式实现的增强类有何区别? 继承实现的增强类: 优点:代码结构清晰,而且实现简单 缺点:对于每一个的需要增强的类都要创建具体的子类来帮助其增强,这样会导致继承体系过于庞大。 修饰模式实现的增强类: 优点:内部可以通过多态技术对多个需要增强的类进行增强,可以使这些装饰类达到互相装饰的效果。使用比较灵活。 缺点:需要内部通过多态技术维护需要增强的类的实例。进而使得代码稍微复杂。*/// 需求1:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有行号。class BufferedReaderLineNum2 extends BufferedReader{ //为什么要继承? 是为了让这些装饰类的对象可以作为参数进行传递,达到互相装饰的效果。 //1.在装饰类的内部维护一个被装饰类的引用。 BufferedReader bufferedReader; int count = 1; public BufferedReaderLineNum2(BufferedReader bufferedReader){ super(bufferedReader);//注意:该语句没有任何作用,只是为了让代码不报错,因为BufferedReader没有无参的构造方法,所以要显示指定调用父类的带参构造方法 this.bufferedReader = bufferedReader; } public String readLine() throws IOException { String line = bufferedReader.readLine(); if(line == null){ return null; } line = count + " " + line; count++; return line; }}//需求2:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有分号。class BufferedReaderLineSemicolon2 extends BufferedReader{ //1.在装饰类的内部维护一个被装饰类的引用。 BufferedReader bufferedReader; public BufferedReaderLineSemicolon2(BufferedReader bufferedReader){ super(bufferedReader); this.bufferedReader = bufferedReader; } public String readLine() throws IOException { String line = bufferedReader.readLine(); if(line == null){ return null; } line = line + ";"; return line; }}//需求3:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有双引号。class BufferedReaderQuote2 extends BufferedReader{ BufferedReader bufferedReader; public BufferedReaderQuote2(BufferedReader bufferedReader) { super(bufferedReader); this.bufferedReader = bufferedReader; } public String readLine() throws IOException { String content = bufferedReader.readLine(); if(content == null) return null; content = "\"" + content + "\""; System.out.println(); return content; }}public class Demo2 { public static void main(String[] args) throws IOException { //1.找到目标文件 File file = new File("src/com/cn/model/Demo2.java"); //2.建立数据通道 FileReader fileReader = new FileReader(file); //3.建立缓冲输入字符流 BufferedReader bufferedReader = new BufferedReader(fileReader); //实现 需求4:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有行号 + 分号。/* //4.建立带分号的缓冲输入字符流 BufferedReaderLineSemicolon2 brs = new BufferedReaderLineSemicolon2(bufferedReader); //4.建立带行号的缓冲输入字符流 BufferedReaderLineNum2 br = new BufferedReaderLineNum2(brs);*/ //实现 需求5:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有分号 + 双引号。 /* BufferedReaderLineSemicolon2 bufferedReaderLineSemicolon2 = new BufferedReaderLineSemicolon2(bufferedReader); BufferedReaderQuote2 br = new BufferedReaderQuote2(bufferedReaderLineSemicolon2);*/ //实现 需求6:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有行号 + 双引号。/* BufferedReaderLineNum2 bufferedReaderLineNum2 = new BufferedReaderLineNum2(bufferedReader); BufferedReaderQuote2 br = new BufferedReaderQuote2(bufferedReaderLineNum2);*/ //实现 需求7:编写一个类拓展BufferedReader的功能,增强readLine方法返回的字符串带有行号 + 分号 + 双引号。 BufferedReaderLineNum2 bufferedReaderLineNum2 = new BufferedReaderLineNum2(bufferedReader); BufferedReaderLineSemicolon2 bufferedReaderLineSemicolon2 = new BufferedReaderLineSemicolon2(bufferedReaderLineNum2); BufferedReaderQuote2 br = new BufferedReaderQuote2(bufferedReaderLineSemicolon2); String content = null; while((content = br.readLine()) != null){ System.out.print(content); } }}
使用装饰者设计模式来增强类Demo2
package com.cn.model;/*** Author:Liu Zhiyong(QQ:1012421396)* Version:Version_1* Date:2016年7月30日20:25:53* Desc:需求:一家三口都会工作,儿子的工作就是画画,母亲的工作就是在儿子的基础上做一个增强,不单单会画画还会涂颜料, 爸爸的工作就是在妈妈的基础上做了增强,就是上画框。*/interface Work{ public void work();}class Son implements Work{ @Override public void work() { System.out.println("画画"); }}class Mother implements Work{ Work worker; //需要被增强的类 public Mother(Work worker) { this.worker = worker; } @Override public void work() { worker.work(); System.out.println("涂颜料"); }}class Father implements Work{ Work worker; public Father(Work worker) { this.worker = worker; } @Override public void work() { worker.work(); System.out.println("上画框"); }}public class Demo3 { public static void main(String[] args) { Son son = new Son();// son.work(); Mother mother = new Mother(son);// mother.work(); Father father = new Father(mother);// father = new Father(son); //也可以不图颜色 father.work(); }}