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



装饰者设计模式的步骤:


    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();​​​​ }​​​​}​​