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)));
何事都只需坚持..
难?
维熟尔。
LZL的自学历程...只需坚持