黑马程序员技术交流社区

标题: 装饰者模式详解 [打印本页]

作者: 大山哥哥    时间: 2017-4-26 16:59
标题: 装饰者模式详解
本帖最后由 大山哥哥 于 2017-4-26 16:59 编辑

前言:
       何为装饰者模式:
                     在不改变原类和继承的情况下动态的扩展对象的功能.通过包装一个对象(类)来实现一个新的具有原来对象相同接口的对象(类).

装饰者模式的特点:
1.    在不改变原有对象的原本的结构上进行功能的添加.
2.    装饰对象和原对象都实现了相同的接口.可以使用于原有对象的方式使用装饰对象.
3.    装饰对象中包含原有对象.即装饰对象是真的的原始对象经过包装之后的对象.

使用环境:
1.    在不影响其他对象的情况下.以动态.透明的方式给单个对象题添加职责.
2.    处理那些可以撤销的职责.
3.    当不您呢个采用生成子类的方法进行扩充的时.一种情况是可能大量独立的扩展.为支持每一种扩展将产生大量的之类.使得之类的数量呈爆炸性增长.另一中情况是因为定义的类被隐藏.或是不能用于生成子类.
参与者:
1.    被装饰的对象基类.
2.    被装饰的对象.
3.    装饰者抽象类
4.    具体的装饰者


代码:

// 基类 接口或者是抽象类  会被 被原始对象或是装饰对象继承或是实现
[Java] 纯文本查看 复制代码
public interface Person {

    void eat();

}


// 原始对象  实现基类的接口
[Java] 纯文本查看 复制代码
public class Man implements Person {
    public void eat() {
        System.out.println("男人在吃");
    }

}


// 装饰者的抽象类 实现基类接口
[Java] 纯文本查看 复制代码
public abstract class Decorator implements Person {
    protected Person person;
    public void setPerson(Person person) {
        this.person = person;
    }

    public void eat() {
        person.eat();
    }
}

//装饰者 继承装饰者的抽象类.而抽象类实现了基类接口那么 此类中也相当于继承了 基类中的方法
[Java] 纯文本查看 复制代码
public class ManDecoratorA extends Decorator {
    public void eat() {
        super.eat();
        reEat();
        System.out.println("ManDecoratorA类");
    }
    public void reEat() {
        System.out.println("再吃一顿饭");
    }
}



public class extends Decorator {
    public void eat() {
        super.eat();
        System.out.println("===============");
        System.out.println("ManDecoratorB类");
    }

}

// 测试类
[Java] 纯文本查看 复制代码
public class Test {
    public static void main(String[] args) {
        Man man = new Man();
        ManDecoratorA md1 = new ManDecoratorA();
        ManDecoratorB md2 = new ManDecoratorB();
     
        md1.setPerson(man);
        md2.setPerson(md1);
        md2.eat();
    }
}
总结: 动态的将功能附加到对象上.想要扩展功能.装饰者是有别于继承的另一种选择.
图解



1.jpg (21.08 KB, 下载次数: 12)

装饰者图解

装饰者图解

作者: 橘子哥    时间: 2017-4-26 17:22
辛苦老师答疑解惑!
作者: 剑桥子卿卿    时间: 2017-4-26 23:45
收下了

作者: zeng1002    时间: 2017-4-27 00:49
老师辛苦了,感谢指点!

作者: 847740441    时间: 2017-4-29 00:22
66666666666666
作者: 小全    时间: 2017-4-29 13:49
第三条有笔误吧
作者: 黑马王大锤    时间: 2017-4-29 21:49
可以的,666666666

作者: wyn5130607    时间: 2017-5-1 16:10
厉害了





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2