定义 Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。 就增加功能来说,装饰模式相比生成子类更为灵活。) 责任链模式的重点是在”链”上,由一条链去处理相似的请求,在链中决定谁来处理这个请求,并返回相应的结果。 组成:Component抽象构件:Component是一个接口或抽象类,就是定义我们最核心的对象,也就是最原始的对象。 ConcreteComponent具体构件:ConcreteComponent是最核心、最原始、最基本的接口或抽象类的实现。要装饰的对象就是它 Decorator装饰角色:一般是一个抽象类,实现接口或抽象方法,它的属性必有一个private变量指向Component抽象构件 具体装饰角色:两个具体装饰类,把最核心的、最原始的、最基本的东西装饰成其他东西 通用类图
优点 装饰者类和被装饰者类可以独立发展,而不会相互耦合:Component类无需知道Decorator类,Decorator类是从外部扩展Component类的功能,而Decorator也不用知道具体的构件 装饰者模式是继承关系的一个替代方案:不管装饰多少层,返回的对象还是Component,实现的还是is-a的关系 装饰者模式可以动态地扩展一个实现类的功能。 扩展性好:通过装饰者模式封装一个类,而不是通过继承来完成。 缺点 多层装饰是比较复杂的。尽量减少装饰类的数量,以便降低系统的复杂度 使用场景 场景:需要扩展一个类的功能,或者给一个类增加附加功能 需要动态地给一个对象增加功能,这功能可以再动态的撤销 需要为一批兄弟类进行改装或加装功能。 代码 装饰者模式 装饰者模式是对继承的有利补充,继承是静态的给类增加功能,而装饰者模式则是动态地增加功能。
装饰者模式如果想要扩展新的装饰者,只用实现Decorator方法即可。
代码 被装饰者抽象(抽象类 )
1 2 3 4 5 6 7 package com.pattern.decorator.component;public abstract class Component { public abstract void operate () ; }
具体的被装饰者(继承自被装饰者抽象 )
1 2 3 4 5 6 7 8 9 package com.pattern.decorator.component;public class ConcreteComponent extends Component { @Override public void operate () { System.out.println("具体的方法" ); } }
装饰者抽象(普通类 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package com.pattern.decorator.decorator;import com.pattern.decorator.component.Component;public abstract class Decorator extends Component { private Component component = null ; public Decorator (Component component) { this .component = component; } @Override public void operate () { this .component.operate(); } }
具体装饰者(继承自装饰者抽象 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package com.pattern.decorator.decorator;import com.pattern.decorator.component.Component;public class ConcreteDecorator extends Decorator { public ConcreteDecorator (Component component) { super (component); } private void decoratorMethod () { System.out.println("对方法进行了装饰" ); } @Override public void operate () { super .operate(); this .decoratorMethod(); } }
测试代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package com.pattern;import com.pattern.decorator.component.Component;import com.pattern.decorator.component.ConcreteComponent;import com.pattern.decorator.decorator.ConcreteDecorator;import com.pattern.decorator.decorator.Decorator;import org.junit.Test;public class DecoratorTest { @Test public void Test () { Component component = new ConcreteComponent (); Decorator decorator = new ConcreteDecorator (component); decorator.operate(); } }
结果
注意 在装饰者模式中,必然有一个最基本、最核心、最原始的接口或抽象充当Component抽象构件 原始方法和装饰方法的执行顺序在具体的装饰类是固定的,可以通过方法重载实现多种执行顺序