装饰者模式
1,定义
动态的给一个对象添加一些额外的职责。
装饰者模式通常有4个角色,就增加功能来说,装饰者模式比生成子类更加的灵活。
Component:抽象构件。通常是一个接口或者抽象类,定义最核心最原始的对象。
public interface AbstractComponent { /** * 抽象方法 */ void operate();}
ConcreteComponent:具体构件。抽象构件的实现,即被装饰的对象。
public class Component implements AbstractComponent { @Override public void operate() { System.out.println("do something!"); }}
Decorator:抽象装饰者角色。通常是一个抽象类,可设置一个被装饰对象。
public abstract class Decorator implements AbstractComponent { /** 定义一个装饰构件 **/ private AbstractComponent abstractComponent; /** * 通过构造函数设置被装饰者 * @param abstractComponent */ public Decorator(AbstractComponent abstractComponent) { this.abstractComponent = abstractComponent; } /** * 委托被装饰着执行 */ @Override public void operate() { this.abstractComponent.operate(); }}
ConcreteDecorator:具体装饰者角色。实现对构件的功能职责的扩展。
public class DecoratorOne extends Decorator { /** * 通过构造函数设置被装饰者 * * @param abstractComponent */ public DecoratorOne(AbstractComponent abstractComponent) { super(abstractComponent); } /** * 定义自己的装饰方法 */ private void methodOne() { System.out.println("DecoratorOne.methodOne 装饰"); } /** * 重写被装饰对象的方法 */ @Override public void operate() { this.methodOne(); super.operate(); }}public class DecoratorTwo extends Decorator { /** * 通过构造函数设置被装饰者 * * @param abstractComponent */ public DecoratorTwo(AbstractComponent abstractComponent) { super(abstractComponent); } /** * 定义自己的装饰方法 */ private void methodTwo() { System.out.println("DecoratorTwo.methodTwo 装饰"); } /** * 重写被装饰对象的方法 */ @Override public void operate() { super.operate(); this.methodTwo(); }}
场景类
public class Client { public static void main(String[] args) { /** 定义被装饰着 **/ AbstractComponent component = new Component(); /** 第一次装饰 **/ component = new DecoratorOne(component); /** 第二次装饰 **/ component = new DecoratorTwo(component); component.operate(); }}
2.应用
2.1 优点
- 装饰者及被装饰者相互独立,两者解耦,提高系统的灵活性。
- 装饰者模式是继承关系的替代方案,且不论被装饰多少层,返回的对象仍然是该被装饰者。
- 装饰者模式可以动态的扩展一个实现类的功能。
2.2 缺点
- 多层装饰会增加实现类的复杂度,减少装饰类的数量可以降低系统的复杂度。
2.3 使用场景
- 动态的为一个对象增加功能,且可以动态的撤销。
- 为一批实现类改装或加装功能。
没有评论:
发表评论