`
iorit2003
  • 浏览: 139357 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

装饰模式(转)

阅读更多
装饰模式是对对象功能增强时,平时使用继承的一种替代方案
一.UML示意图:

二.组成部分:
1.       抽象构件:原始的功能接口
2.       具体构件:具体的原始功能类
3.       装饰角色:持有具体构件类的对象,以便执行原有功能
4.       具体装饰:具体扩展的功能在这里
三.例子代码:使用装饰模式来演示一个对”行走”功能扩展的例子(听音乐+行走和唱歌+行走)
1. 抽象构件
package com.eekq.decorator;

publicinterface Component {
    /**原始接口*/
    publicvoid go();
}
2. 具体构件
package com.eekq.decorator;

publicclass ConcreteComponent implements Component {

    publicvoid go() {    
        System.out.println("行走");
    }

}
3.装饰角色来了
package com.eekq.decorator;

publicclass Decorator implements Component {
    /**持有私有的原始构件*/
    private Component component;

    /**构造子,委派给原始构件*/
    protected Decorator(Component component) {
        this.component = component;
    }

    /**调用原始构件功能,通常就可直接把扩展功能加在此方法中*/
    publicvoid go() {
        this.component.go();
    }

}
4.具体装饰(这里演示了两种扩展的情况,走路+听音乐和唱歌s)
(1).
package com.eekq.decorator;

publicclass ConcreteDecoratorListen extends Decorator {

    /**构造子,相关初始化*/
    public ConcreteDecoratorListen(Component component) {
        super(component);
        // code is here
    }

    /**商业逻辑,对原始构件功能的扩展*/
    publicvoid go() {    
        listen("听音乐");//执行扩展功能
        super.go();
    }
   
    privatevoid listen(Object obj){
        System.out.println(obj);       
    }

}
(2).
package com.eekq.decorator;

publicclass ConcreteDecoratorSing extends Decorator {

    /**构造子,相关初始化*/
    public ConcreteDecoratorSing(Component component) {
        super(component);
        // code is here
    }

    /**商业逻辑,对原始构件功能的扩展*/
    publicvoid go() {    
        super.go();
        System.out.println(sing());;// 执行扩展功能
    }

    private String sing() {
        return"唱歌";
    }
}
5.客户端调用
package com.eekq.decorator;

publicclass Main {

    publicstaticvoid main(String[] args) {
        /**原始构件*/
        Component component = new ConcreteComponent();
        /**边听音乐,边走路*/
        ConcreteDecoratorListen cdl = new ConcreteDecoratorListen(component);
        cdl.go();
        System.out.println();
        /**边走路,边唱歌*/
        ConcreteDecoratorSing cds = new ConcreteDecoratorSing(component);
        cds.go();
    }

}
四.总结
优点:装饰模式和继承都是对功能的扩展,而装饰模式使用的是组合,可以不用继承而达到这一效果.使用过多的继承会增加系统的复杂性和偶合性
缺点:装饰模式要产生一些辅助性的对象,但这些对象看上去都比较像,不是很容易检查(好的命名应该是提高检查的一个办法)
分享到:
评论

相关推荐

    高职建筑装饰CAD翻转课堂教学模式实践.pdf

    高职建筑装饰CAD翻转课堂教学模式实践.pdf

    PHP设计模式之装饰器模式定义与用法详解

    作为一种结构型模式, 装饰器(Decorator)模式就是对一个已有结构增加”装饰”. 适配器模式, 是为现在有结构增加的是一个适配器类,.将一个类的接口,转换成客户期望的另外一个接口.适配器让原本接口不兼容的类可以很好...

    Delphi模式编程第一分卷

    12.3.1 装饰者模式在图片观赏器中的应用 12.3.2 范例小结 第13章 门面模式(Facade) 13.1 模式解说 13.2 结构和用法 13.2.1 模式结构 13.2.2 代码模板 13.2.3 问题讨论 13.3 范例与实践 13.3.1 门面模式和...

    Delphi模式编程第二分卷

    12.3.1 装饰者模式在图片观赏器中的应用 12.3.2 范例小结 第13章 门面模式(Facade) 13.1 模式解说 13.2 结构和用法 13.2.1 模式结构 13.2.2 代码模板 13.2.3 问题讨论 13.3 范例与实践 13.3.1 ...

    JavaScript模式中文[pdf] 百度云

     装饰者模式  策略模式  外观模式  代理模式  中介者模式  观察者模式  小结  第8章 DOM和浏览器模式  关注分离  DOM脚本  事件  长期运行脚本  远程脚本  配置JavaScript  载入策略

    设计模式(23种)与设计原则(6种)

    9)装饰模式(Decorator) 10)门面模式(Facade) 11)享元模式(Flyweight) 12)代理模式(Proxy) 13)职责链模式(Chain of Responsibility) 14)命令模式(Command) 15)解析器模式(Interpreter) 16)迭代...

    Java设计模式.docx

    工厂模式:工厂模式是一种创建型模式,它定义了一个用于创建...装饰者模式:装饰者模式是一种行为型模式,它允许在运行时动态地扩展对象的功能。 代理模式:代理模式是一种行为型模式,它允许控制对另一个对象的访问。

    尚硅谷设计模式源码笔记课件.zip

    结构型模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、...

    Java设计模式 版本2

    对象的克隆——原型模式,复杂对象的组装与创建——建造者模式,不兼容结构的协调——适配器模式,处理多维度变化——桥接模式,树形结构的处理——组合模式,扩展系统功能——装饰模式,深入浅出外观模式,实现对象...

    Java23种设计模式详解,看这一个就够了

    Java设计模式共有23种,分别为:抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式、桥接模式、组合模式、装饰模式、享元模式、代理模式、命令模式、解释器模式、访问者模式、迭代子...

    Head First 设计模式 JAVA源码

    第八讲:装饰模式 第九讲:策略模式 第十讲:观察者模式 第十一讲:享元模式 第十二讲:代理模式 第十三讲:外观模式 第十四讲:组合模式 第十五讲:桥接模式 第十六讲:适配器模式 第十七讲:解释器模式 ...

    23种设计模式入门到精通详解.txt

    装饰模式:动态的给对象添加新的功能。 代理模式:为其他对象提供一个代理以便控制这个对象的访问。 亨元(蝇量)模式:通过共享技术来有效的支持大量细粒度的对象。 外观模式:对外提供一个统一的方法,来访问子...

    c++设计模式全系列+应用场景+实例说明

    4. **装饰者模式(Decorator Pattern)**:装饰者模式是一种结构设计模式,允许向一个对象动态添加新功能,而无需修改其源代码。 5. **策略模式(Strategy Pattern)**:策略模式是一种行为设计模式,定义了一系列...

    JavaScript模式 斯托扬·斯特凡洛夫 著

    前言 第1章 简介 模式 ...装饰者模式 策略模式 外观模式 代理模式 中介者模式 观察者模式 小结 第8章 DOM和浏览器模式 关注分离 DOM脚本 事件 长期运行脚本 远程脚本 酉己置JavaScript 载入策略 小结

    GoF 的 23 种设计模式

    装饰(Decorator)模式:动态的给对象增加一些职责,即增加其额外的功能。 外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。 享元(Flyweight)模式:运用共享技术来有效...

    深入浅出设计模式(中文版)

    4.4DecoratorPattern(装饰模式) 125 4.4.1定义 125 4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 ...

    深入浅出设计模式(中文版电子版)

    4.4DecoratorPattern(装饰模式) 125 4.4.1定义 125 4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 ...

    PHP设计模式精彩剖析

    PHP设计模式是一种面向对象编程的技术,它们提供了一套解决常见软件设计问题的经验总结和通用解决方案。设计模式可以帮助开发人员编写可重用...7. 装饰者模式(Decorator Pattern):动态地给一个对象添加额外的功能。

Global site tag (gtag.js) - Google Analytics