装饰者模式:动态的给一个对象添加一些额外的职责,就添加功能来说,装饰者模式比单纯的生成子类更加灵活。
这里首先举例一个场景,一个主功能和多个辅功能结合一起实现一个功能。
类图如下:
大概讲解一下,就是说首先定义一个统一接口,
而后定义多个(或一个)主功能,这里只是定义了一个KeyComponent,可以添加多个,实现本身功能。
然后定义一个抽象类,是所有辅功能的父类,在里面定义变量component,并写出变量的get,set方法。
最后定义具体辅功能的实现类,重写功能方法,并在实现方法后实现主功能的方法。
具体代码如下:
服务端:
public abstract class Component { abstract void show(); }
public class KeyComponent extends Component{ @Override void show() { System.out.println("Key Class"); } }
public abstract class Decorator extends Component { protected Component component; public void setComponent(Component component) { this.component = component; } @Override void show() { component.show(); } }
public class DecoratorA extends Decorator{ @Override public void show(){ System.out.println("DecoratorA"); component.show(); } }
public class DecoratorB extends Decorator{ @Override public void show() { System.out.println("DecoratorB"); component.show(); } }
客户端:
public class DecoratorTest { public static void main(String[] args){ KeyComponent keyComponent=new KeyComponent(); DecoratorA decoratorA=new DecoratorA(); DecoratorB decoratorB=new DecoratorB(); decoratorA.setComponent(keyComponent); decoratorB.setComponent(decoratorA); decoratorB.show(); } }
装饰的方法是:首先利用KeyComponent实例化对象keyComponent, 然后利用实例化的对象DecoratorA和DecoratorB来包装keyComponent,最后执行最终的装饰对象DecoratorB的show方法。
总结:
装饰者模式就是把类的核心职责(主要功能)和装饰职责(辅功能)区分开来实现,这样我们可以动态的去除或添加功能实现,实现动态修改功能职责的问题,而且这样还可以抽离出来辅助功能的重复代码。