`
leoyu
  • 浏览: 12357 次
  • 性别: 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();
    }
 
}
四.总结
优点:装饰模式和继承都是对功能的扩展,而装饰模式使用的是组合,可以不用继承而达到这一效果.使用过多的继承会增加系统的复杂性和偶合性
缺点:装饰模式要产生一些辅助性的对象,但这些对象看上去都比较像,不是很容易检查(好的命名应该是提高检查的一个办法)
作者:飞行鱼 QQ:6868861 推荐J2EE群:7715552
 

 

分享到:
评论

相关推荐

    设计模式:可复用面向对象软件的基础--详细书签版

    整个设计模式领域还很新,本书的四位作者也许已占据了这个领域造诣最深的专家中的半数,因而他们定义模式的方法可以作为后来者的榜样。如果要知道怎样恰当定义和描述设计模式,我们应该可以从他们那儿获得启发”--steve...

    设计模式之装饰者模式,内含可运行代码

    总的来说,装饰者模式是一种强大的设计模式,它提供了一种在运行时动态调整对象行为的方法,使得代码更具灵活性和可扩展性。通过理解和熟练运用装饰者模式,我们可以更好地应对软件需求的变化,提高代码的可维护性和...

    设计模式可复用面向对象软件的基础(c++).pdf

    - **第4章 结构型模式**:涵盖了用于组合类和对象以形成更大的结构的模式,如适配器模式、装饰器模式等,它们提供了一种方式来组装系统组件,使得系统架构更加清晰和模块化。 - **第5章 行为模式**:探讨了用于定义...

    用PHP语言实现16个设计模式.zip

    9. 装饰模式:动态地给一个对象添加一些额外的职责,增加功能而不影响其父类。在PHP中,可以用于在运行时添加日志、缓存等特性。 10. 外观模式:提供一个简单的接口,用于与复杂的子系统交互。它简化了客户端代码,...

    设计模式概述及23种设计模式

    21. 装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活。 22. 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一...

    重学java的设计模式

    1. 适配器模式:将两个不兼容的接口转换为可以协同工作的接口,常用于集成第三方库或旧系统。 2. 装饰器模式:动态地给对象添加一些额外的职责,提供了比继承更多的灵活性。 3. 代理模式:为其他对象提供一种代理以...

    设计模式可复用面向对象软件的基础.zip

    第4章 结构型模式 91 4.1 Adapter(适配器)—类对象结构型 模式 92 4.2 Bridge(桥接)—对象结构型 模式 100 4.3 Composite(组成)—对象结构型 模式 107 4.4 Decorator(装饰)—对象结构型 模式 115 4.5 FACADE...

    java设计模式第二版源码

    这里我们主要关注的是"Java设计模式第二版源码",这可能是一个包含各种设计模式实现的代码库。 设计模式分为三类:创建型模式、结构型模式和行为型模式。创建型模式主要关注对象的创建过程,如单例模式(Singleton...

    Head First 设计模式 JAVA源码

    第四讲:工厂模式在开发中的运用 第五讲:单例模式 第六讲:原型模式 第七讲:建造者模式 第八讲:装饰模式 第九讲:策略模式 第十讲:观察者模式 第十一讲:享元模式 第十二讲:代理模式 第十三讲:外观...

    软件设计模式与体系结构课后习题代码(孙玉山).zip

    4. 装饰器模式:动态地给一个对象添加一些额外的职责,可以扩展功能而不影响其他对象。 5. 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 其次,我们关注“体系结构”。软件体系结构是软件系统的高...

    李建忠 C#面向对象设计模式纵横谈(25):设计模式总结

    在第25讲中,他集中对整个系列进行了一次全面的总结,让我们一起来回顾和探讨这些设计模式的核心要点。 设计模式是经过实践验证的、在特定场景下解决常见问题的最佳解决方案。它们是面向对象设计的智慧结晶,通过...

    设计模式期末试题下载

    1. **种类**:共有23种设计模式被记录在著名的《设计模式:可复用面向对象软件的基础》一书中,这些模式由Erich Gamma等四位作者提出,因此也被称为GOF设计模式。 2. **分类**:这23种模式可以根据其目的分为三大类...

    C++设计模式大总结

    - 装饰模式:动态地给一个对象添加一些额外的职责。 - 复合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。 4. **行为型设计模式** - 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到...

    Java设计模式之禅

    4. 装饰模式(Decorator Pattern):动态地给一个对象添加一些额外的职责。 5. 外观模式(Facade Pattern):为子系统中的一组接口提供一个统一的界面。 6. 享元模式(Flyweight Pattern):运用共享技术有效地支持...

    Javascript 设计模式 电子书

    4. 观察者模式:该模式用于定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。观察者模式在JavaScript事件处理中应用非常广泛。 5. 发布/订阅模式:这...

    设计模式——刘伟

    4. **装饰器模式**:动态地给一个对象添加一些额外的职责,既保留了原有类的行为,又可以扩展其功能,避免使用继承带来的复杂性。 5. **适配器模式**:将两个不兼容的接口通过适配器进行转换,使得原本不能一起工作...

Global site tag (gtag.js) - Google Analytics