设计模式(三)装饰者模式

  1. 定义
    装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
  2. 设计原则
    开放-关闭原则:类应该对扩展开发,对修改关闭。开放-关闭原则,允许在不修改现有代码的情况下实现功能扩展,但遵循开放-关闭原则通常会引入新的抽象层,增加代码的复杂度,因此没有必要把每个细节都这样设计,我们只需在设计中最有可能改变的地方应用该原则即可。
  3. UML
    这里写图片描述
    说明:
    1) 装饰者和被装饰者对象拥有相同的超类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象替代它。
    2) 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
    3) 对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。

  4. 实现

/**
 * 抽象类-抽象组件
 */
public abstract class Component {
    private String description = "unknown component";

    public void setDescription(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }
}
/**
 * 抽象类-抽象装饰者
 */
public abstract class Decorator extends Component {
    Component component;
    public abstract String getDescription();
}
/**
 * 具体的组件
 */
public class ConcreteComponent extends Component {
    public ConcreteComponent() {
        setDescription("component");
    }
}
/**
 * 具体的装饰者A
 */
public class ConcreteDecoratorA extends Decorator {

    public ConcreteDecoratorA(Component component) {
        this.component = component;
    }

    public String getDescription() {
        return "useful " + component.getDescription();
    }
}
/**
 * 具体的装饰者B
 */
public class ConcreteDecoratorB extends Decorator {

    public ConcreteDecoratorB(Component component) {
        this.component = component;
    }

    public String getDescription() {
        return "important " + component.getDescription();
    }
}
/**
 * 测试类-装饰者模式
 */
public class DecoratorTest {
    public static void main(String[] args) {
        Component component = new ConcreteComponent();
        component = new ConcreteDecoratorA(component);
        component = new ConcreteDecoratorB(component);
        System.out.println(component.getDescription());
    }
}

运行结果:
这里写图片描述

参考资料:
《Head First设计模式》

猜你喜欢

转载自blog.csdn.net/ifwinds/article/details/69564831
今日推荐