java 28 - 3 设计模式之 装饰设计模式

装饰设计模式

  装饰设计模式概述

  装饰模式就是使用被装饰类的一个子类的实例,在客户端将这个子类的实例交给装饰类。是继承的替代方案

  优点

  使用装饰模式,可以提供比继承更灵活的扩展对象的功能,它可以动态的添加对象的功能,并且可以随意的组合这些功能

  缺点

  正因为可以随意组合,所以就可能出现一些不合理的逻辑

 

装饰设计模式,就是继承的替代方案。

例子:

  手机的例子:(装饰设计模式)

 

现在用个电脑类来写代码例子:

  

  1、现在有个电脑的规则接口:

 1 /**
 2  * 这是电脑类的规则接口
 3  * 
 4  * @author LZL
 5  * 
 6  */
 7 public interface Computer {
 8     // 电脑用来办公
 9     public void office();
10 }

 

  2、制作了一台ThinkPad电脑:(实现电脑规则接口的实现类)

 1 /**
 2  * 
 3  * 实现了电脑规则的接口
 4  * 
 5  * @author LZL
 6  * 
 7  */
 8 
 9 public class ThinkPad implements Computer {
10 
11     public void office() {
12         System.out.println("ThinkPad可以办公");
13     }
14 
15 }

 

  3、我想用这台电脑在办公后编程,那么我就需要一个总的装饰类,以及一个编程的装饰类

 

  总的装饰类:(由于是对电脑进行装饰,所以要实现电脑规则的接口)

 1 /**
 2  * 这是对电脑进行装饰的装饰类
 3  * 
 4  * @author LZL
 5  * 
 6  */
 7 public class CPDecorate implements Computer {
 8 
 9     // 接收一个电脑类
10     private Computer cp;
11 
12     public CPDecorate(Computer cp) {
13         this.cp = cp;
14     }
15 
16     // 实现电脑类的方法
17     public void office() {
18         this.cp.office();
19     }
20 
21 }

 

  编程的装饰类:(对电脑增加编程功能的装饰类,得继承电脑的装饰类来实现)

 1 /**
 2  * 这是对电脑增加编程功能的装饰类,得继承电脑的装饰类来实现
 3  * 
 4  * @author LZL
 5  * 
 6  */
 7 
 8 public class ProGramme extends CPDecorate {
 9 
10     public ProGramme(Computer cp) {
11         super(cp);
12     }
13 
14     // 调用电脑的办公功能
15     public void office() {
16 
17         super.office();
18         System.out.println("还可以编程");
19     }
20 
21 }

 

  同理,我想要在办公前听下音乐,就要一个音乐的装饰类:

 1 public class Music extends CPDecorate {
 2 
 3     public Music(Computer cp) {
 4         super(cp);
 5     }
 6 
 7     public void office() {
 8         System.out.println("听音乐");
 9         super.office();
10     }
11 }

 

  最后,我运行这台电脑:

 1 public class ComputerDemo {
 2 
 3     public static void main(String[] args) {
 4 
 5         // 创建电脑对象
 6         Computer cp = new ThinkPad();
 7         cp.office();
 8         System.out.println("--------");
 9 
10         // 我要办公后来编程,那么就需要一个装饰类来实现
11         // 创建装饰后的电脑对象
12         CPDecorate cpd = new ProGramme(cp);
13         cpd.office();
14         System.out.println("------");
15 
16         // 我想在办公前听音乐,再来个装饰类
17         cpd = new Music(cp);
18         cpd.office();
19         System.out.println("------");
20         
21         // 我想在办公前听音乐,办公后编程
22         cpd = new Music(new ProGramme(cp));
23         cpd.office();
24     }
25 
26 }

 

  其实,我们之前在IO流就已经用过了装饰设计模式。

理解下面:

比如:

  输入字节流转换成输入字符流:(一次性只能读取一个字节  →  一次性可以读取一个字符)

InputStreamReader isr = new InputStreamReader(is);

  然后再转换成高效输入字符流:(一次性只能读取一个字符   →  一次性可以读取一行字符)

BufferedReader br = new BufferedReader(isr);

  上面两个合起来: 输入字节流转换成高校输入字符流(一次性只能读取一个字节  →   一次性可以读取一行字符)

1 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

  还有,输出字节流转换成高效输出字符流

1 BufferedWriter bw = new BufferedWriter((newOutputStreamWriter(
2                 System.out)));

 

posted @ 2016-10-17 17:39  卡拉瓦  阅读(174)  评论(0编辑  收藏  举报