装饰者模式(Decorator Pattern)

来源:互联网 发布:铁矿石港口库存数据 编辑:程序博客网 时间:2024/06/08 11:13

装饰者模式(Decorator Pattern)(对象结构型设计模式)
——动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。


设计原则

  • 类应该对扩展开放,对修改关闭。(开放—关闭原则。)

结构

这里写图片描述

Component

  • 定义一个对象接口,可以给这些对象动态的添加职责。

ConcreteComponent

  • 定义一个对象,可以给这个对象添加一些职责。

Decorator

  • 维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。

ConcreteDecorator

  • 向组件添加职责。

Java I/O

——真实世界的装饰者。

”黑暗面“

  • 在设计中加入大量的小类。
  • 代码会依赖特定的类型。
  • 实例化组件时,会增加代码的复杂度。(工厂模式和生成器模式对这个问题有帮助。)

For example

public abstract class Beverage {    String description = "Unknown Beverage";    public String getDescription()    {        return description;    }    public abstract double cost();}
public abstract class CondimentDecorator extends Beverage{    public abstract String getDescription();}
public class Espresso extends Beverage{    public Espresso()    {        description = "Espresso";    }    public double cost()    {        return 1.99;    }}
public class HouseBlend extends Beverage{    public HouseBlend()    {        description = "HouseBlend";    }    public double cost()    {        return 0.89;    }}
public class Mocha extends CondimentDecorator{    Beverage beverage;    public Mocha(Beverage beverage)    {        this.beverage = beverage;    }    public String getDescription()    {        return beverage.getDescription() + ", Mocha";    }    public double cost()    {        return .2 + beverage.cost();    }}
public class StarbuzzCoffee {    public static void main(String[] args)    {        Beverage beverage = new Espresso();        System.out.println(beverage.getDescription()                + " $" + beverage.cost());        Beverage beverage2 = new HouseBlend();        beverage2 = new Mocha(beverage2);        beverage2 = new Mocha(beverage2);        System.out.println(beverage2.getDescription()                + " $" + beverage2.cost());    }}

参考《设计模式》《Head First Design Patterns》

0 0