设计模式之装饰者模式(Decorator)

来源:互联网 发布:歧视 知乎 编辑:程序博客网 时间:2024/06/15 22:33

装饰者模式(Decorator)动态地扩展一个对象的功能而不必改变源类文件和使用继承。它的设计原则是:多用组合,少用继承。

装饰者模式的优点

  1. 装饰者模式与继承关系的目的都是要扩展对象的功能,继承是静态的,它在系统运行前就决定了。装饰者更加灵活。
  2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。

在装饰模式中的各个角色

  • 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象;
  • 具体构件(Concrete Component)角色:定义一个将要接收附加责任的类;
  • 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口;
  • 具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。
抽象构件:
/** * 一个接口,定义需要扩展的功能 */public interface IComponent{   public void exampleFun();}

具体构件:
/** * 接口的具体实现类 */public class ConcreteComponent implements IComponent{   @Override   public void exampleFun()   {      System.out.println("This is exampleFun!");   }}

装饰角色:
/** * 装饰角色,包含一个IComponent对象实例,并实现一个与接口一致的方法。 * 可以传入相同类型的不同的实例来改变功能。 */public class Decorator implements IComponent{   private IComponent mComponent = null;      public Decorator(IComponent component)   {      mComponent = component;   }      @Override   public void exampleFun()   {      mComponent.exampleFun();   }}

具体装饰角色:
/** * 具体装饰角色,负责给构件对象添加上附加的责任 */public class ConcreteDecorator extends Decorator{   public ConcreteDecorator(IComponent component)   {      super(component);   }      @Override   public void exampleFun()   {      super.exampleFun();            // 附加的相关功能      System.out.println("Doing other things in ConcreteDecorator...");   }      public void otherFun()   {         }}

测试:
   public static void main(String[] args)   {      IComponent component = new ConcreteComponent();      ConcreteDecorator decorator = new ConcreteDecorator(component);      decorator.exampleFun();   }

结果:
This is exampleFun!Doing other things in ConcreteDecorator...


大家会发现装饰者模式和对象的适配器模式有点类似。适配器的主要目的是将一个类的接口转换成客户希望的另外一个接口,在转换时也可以增加新的职责,但主要目的不在此。装饰者模式主要是给被装饰者增加新职责的。


0 0
原创粉丝点击