装饰者模式

2018-09-12  本文已影响0人  笨笨翔

在《JAVA与模式》一书开头是这样描述装饰(Decorator)模式的:

装饰模式又名包装模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。

1. 模式动机

一般有两种方式可以实现给一个类或对象增加行为:

2. 模式定义

装饰模式:动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。其别名也可以成为包装器,与适配器模式的别名相同,但它们适用于不同的场合。根据翻译的不同,装饰模式也有人称之为“油漆工模式”,它是一种对象结构性模式。

3. 模式结构

装饰模式包含如下角色:

4. 时序图

image

5. 代码分析

/**
 * 抽象构建
 */
public interface Component {
    void operation();
}
/**
 * 具体构建
 */
public class ConcreteComponent implements Component {
    private String name;
    ConcreteComponent(String name){
        this.name = name;
    }

    @Override
    public void operation() {
        System.out.println("装扮的" + name);
    }
}
/**
 * 抽象装饰类
 */
public abstract class Decorator implements Component {

     public Component component;

    public void setComponent(Component component) {
        this.component = component;
    }

    @Override
    public void operation() {
        if(component != null)
            component.operation();
    }
}
/**
 * 具体装饰类
 */
public class ConcreteDecoratorA extends Decorator {

    @Override
    public void operation() {
        super.operation();
        System.out.println("穿大衣");
    }
}
/**
 * 具体装饰类
 */
public class ConcreteDecoratorB extends Decorator {

    @Override
    public void operation() {
        super.operation();
        System.out.println("穿跨裤👖");
    }
}
public class MainClass {
    public static void main(String[] args) {
        ConcreteComponent xiaocai = new ConcreteComponent("小菜");
        ConcreteDecoratorA dayi = new ConcreteDecoratorA();
        ConcreteDecoratorB kuzi = new ConcreteDecoratorB();
        dayi.setComponent(xiaocai);
        kuzi.setComponent(dayi);
        kuzi.operation();
    }
}

运行结果


image.png

6. 模式分析

7. 优点

装饰模式的优点:

8. 缺点

装饰模式的缺点:

9. 适用环境

在以下情况下可以使用装饰模式:

10. 模式应用

装饰模式在Java语言中最著名的应用莫过于Java I/O标准库的设计了。

11. 模式扩展

装饰模式的简化-需要注意的问题:

12. 总结

参照图悦设计模式

上一篇下一篇

猜你喜欢

热点阅读