对象结构型 - 装饰模式

Posted 巅峰小学生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对象结构型 - 装饰模式相关的知识,希望对你有一定的参考价值。

介绍

* 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能
* 它是通过创建一个包装对象,也就是装饰来包裹真实的对象

优点

* 可以为已有功能动态地添加上其他新功能
* 比继承更多的灵活性
* 把类中的装饰功能从类中移除出去,让类简化,是类的核心逻辑和装饰功能分开
* 通过使用不同的 具体装饰类 以及这些装饰类的[排列组合],设计师可以创造出很多 [不同行为的组合]

缺点

* 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂
* 装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适

使用场景

以下情况使用Decorator模式
* 需要扩展一个类的功能,或给一个类添加附加职责
* 需要动态的给一个对象添加功能,这些功能可以再动态的撤销
* 当不能采用生成子类的方法进行扩充时
	1. 一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长
	2. 另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

参考(https://baike.baidu.com/item/装饰模式/10158540?fr=aladdin)

入门案例:

UML图解:

代码:

[Component]

person:

public interface Person {
    void doSomething(); //做些事情
}

[ConcreteComponent ]

Man:

public class Man implements Person {

    private void eat(){
        System.out.println("吃饭");
    }

    @Override
    public void doSomething() {
        eat();
    }

}

[Decorator]

Decorator:

//一个装饰器抽象类
public abstract class Decorator implements Person {

    protected Person person;

    public Decorator(Person person){
        this.person = person;
    }

    @Override
    public void doSomething() {
        if (person != null)
            person.doSomething();
    }
}

[ConcreteDecorator]

WatchTV_Decorator:

public class WatchTV_Decorator extends Decorator {

    public WatchTV_Decorator(Person person) {
        super(person);
    }

    @Override
    public void doSomething() {
        System.out.println("看电视");
        super.doSomething();
    }
}

Somke_Decorator

public class Smoke_Decorator extends WatchTV_Decorator {

    public Smoke_Decorator(Person person) {
        super(person);
    }

    @Override
    public void doSomething() {
        super.doSomething();
        System.out.println("抽烟");
    }
}

测试:

public class Main {

    public static void main(String[] args){

        Person man = new Man();

        //情况1:这个男人想做什么呢
//        man.doSomething();
        /**
         *  output:
         *      吃饭
         */


        //情况2:这个男人想在吃饭前看看电视
//        Decorator watchTV_decorator = new WatchTV_Decorator(man);
//        watchTV_decorator.doSomething();
        /**
         *  output:
         *      看电视
         *      吃饭
         */


        //情况3:这个男人想在吃饭前看看电视切吃完饭还想抽烟
        Decorator smoke_decorator = new Smoke_Decorator(man);
        smoke_decorator.doSomething();
        /**
         *  output:
         *      看电视
         *      吃饭
         *      抽烟
         */

    }
}

以上是关于对象结构型 - 装饰模式的主要内容,如果未能解决你的问题,请参考以下文章

装饰模式

Java开发设计模式 09:装饰器模式

设计模式:结构型-装饰器模式

设计模式之装饰模式20170726

Java设计模式之装饰者模式

C++装饰器模式的实现