大话设计模式之装饰模式读后感
引言:让我们重温经典,致敬经典
装饰模式:动态的给一个对象添加一些额外的职能,就增加功能来说,装饰模式比生成子类更加的灵活
UML图:
总结:
装饰模式是为已有功能动态的添加更多功能的一种方式,
把每个要装饰的功能放在一个单独的类里面,并让这个类去包装它所要装饰的对象,每个装饰类只需要关注自己要实现的功能,不去关注如何被添加到对象链中去。因此在执行特殊行为时,客户端就可以在运行时根据需要有选择的按顺序的使用装饰功能包装对象。把类中的装饰功能从类中移走出去了,这样简化了原有的类,符合职责单一原则,有效的把类的核心功能和装饰功能进行分离,而且可以去除相关类中的重复装饰逻辑。
代码实现:
1 package com.dzf.designtest; 2 3 /** 4 * <p> 5 * 6 * 装饰设计模式: 7 * 1.核心:动态的为一个对象添加一些额外的功能,就增加功能而言,比生成子类更加的灵活 8 * </p> 9 * 10 * @author dingzf 11 * @date 2018/3/28 12 * @time 21:46 13 */ 14 public class DecoratorDemo1 { 15 public static void main(String[] args) { 16 CreateComponent t = new CreateComponent(); 17 DecoratorOne decoratorOne = new DecoratorOne(); 18 DecoratorTwo decoratorTwo= new DecoratorTwo(); 19 decoratorOne.setComponent(t); 20 decoratorTwo.setComponent(decoratorOne); 21 decoratorTwo.a(); 22 } 23 } 24 25 abstract class Component{ 26 //初始的功能 27 public abstract void a(); 28 } 29 class CreateComponent extends Component{ 30 @Override 31 public void a() { 32 System.out.println("我会用java"); 33 } 34 } 35 abstract class Decorator extends Component{ 36 private Component component; 37 public void setComponent(Component component){ 38 this.component= component; 39 } 40 41 @Override 42 public void a() { 43 if (component!=null){ 44 component.a(); 45 } 46 } 47 } 48 class DecoratorOne extends Decorator{ 49 @Override 50 public void a() { 51 System.out.println("我是秦下,我会做饭"); 52 super.a(); 53 } 54 } 55 class DecoratorTwo extends Decorator{ 56 @Override 57 public void a() { 58 System.out.println("我会吃水果"); 59 super.a(); 60 } 61 }
我们来解读下总结里面的话:
1.把每个要装饰的功能放在一个单独的类里面,并让这个类去包装它所要装饰的对象
这句话的意思是我们把需要将特有的装饰功能封装成一个单独的类,并且这个类里面有我们需要包装的对象。如上面代码中的DecoratorTwo 和DecoratorOne 这两个类。
2.每个装饰类只需要关注自己要实现的功能,不去关注如何被添加到对象链中去
在编写一个装饰类的时候,我们只需要把我们需要完成的功能编写好,然后最后再调用一下父类的方法就可以了。至于怎么如何添加到对象链中去,看需求,让调用者去做这件事
3.在执行特殊行为时,客户端就可以在运行时根据需要有选择的按顺序的使用装饰功能包装对象
在我们需要什么装饰功能的时候,我们就把初始化这个这个装饰类,把我们需要装饰的类传进去。
外话: 以上是我读大话设计模式之装饰模式的读后感,虽然读了好多次,感觉每次都有收获,记录下来,就当自己的又一次又一次加深理解,有不对的地方希望能够提出,谢谢。
越努力越幸运