码迷,mamicode.com
首页 > 其他好文 > 详细

对象结构型 - 装饰模式

时间:2018-01-01 11:31:10      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:功能   分享图片   很多   不同的   测试   继承   大量   ring   extends   

介绍

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

优点

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

缺点

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

使用场景

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

参考(https://baike.baidu.com/item/%E8%A3%85%E9%A5%B0%E6%A8%A1%E5%BC%8F/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:
         *      看电视
         *      吃饭
         *      抽烟
         */

    }
}

对象结构型 - 装饰模式

标签:功能   分享图片   很多   不同的   测试   继承   大量   ring   extends   

原文地址:https://www.cnblogs.com/tandi19960505/p/8160524.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!