天天看点

装饰者设计模式

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

装饰者设计模式的步骤:

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

继续阅读