装饰模式优点:将类中原有的装饰功能移出,作为单独的一个或几个对象。简化了原有的类,同时又可以动态的为类增加某一项或某几项装饰,而不必修改原类。有效的把类的核心职责和装饰功能区分开来,并且去除相关类中重复的装饰逻辑。同时让类在某些特定的时候,才拥有某些特定的功能。
常用场景:加密数据、过滤词汇。
装饰模式中的角色可以分为:
1、component:对象接口,可以对对象动态的添加装饰。是所有类的顶端接口。
2、decorator:装饰类。是所有装饰对象的父类。在这里set和get被添加装饰的对象。
3、concrete:具体的对象,可以被添加装饰。
4、decoratorA:具体装饰类。类中有特有的装饰,可以添加给具体的对象。
例子:
component
inteface Component { public void say(); }
concrete
public class Concrete implement Component { public void say(){ System.out.println("我是Concrete"); } }
decorator
public class Decorator implement Component { private Component component; public Decorator(Component component){ this.component = component; } public void setComponent(Component component){ this.component = component; } public Component getComponent(){ return component; } public void say(){ if(component != null){ component.say(); } } }
decoratorA
public class DecoratorA extend Decorator { private void A(){ System.out.println("我被装饰了方法A"); } public void say(){ super.say(); A(); } }
客户端
public static void main(String[] args) { Concrete c = new Concrete(); DecoratorA d = new DecoratorA(); d.setComponent(c); d.say(); }
代码执行后,输出结果:
我是Concrete
我被装饰了方法A
在装饰模式中,装饰类可以有多个,例如DecoratorB,DecoratorC,DecoratorD。这些装饰类可以被自由地动态地为对象增加某些功能,并且互不影响,且不影响原功能。
如果用来被装饰的对象只有一种,则decorator类可以直接继承被装饰的对象。component不是必要存在的。