第四个设计模式:装饰模式
装饰模式是对对象功能增强时,平时使用继承的一种替代方案
一.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...
总的来说,装饰者模式是一种强大的设计模式,它提供了一种在运行时动态调整对象行为的方法,使得代码更具灵活性和可扩展性。通过理解和熟练运用装饰者模式,我们可以更好地应对软件需求的变化,提高代码的可维护性和...
- **第4章 结构型模式**:涵盖了用于组合类和对象以形成更大的结构的模式,如适配器模式、装饰器模式等,它们提供了一种方式来组装系统组件,使得系统架构更加清晰和模块化。 - **第5章 行为模式**:探讨了用于定义...
9. 装饰模式:动态地给一个对象添加一些额外的职责,增加功能而不影响其父类。在PHP中,可以用于在运行时添加日志、缓存等特性。 10. 外观模式:提供一个简单的接口,用于与复杂的子系统交互。它简化了客户端代码,...
21. 装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活。 22. 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一...
1. 适配器模式:将两个不兼容的接口转换为可以协同工作的接口,常用于集成第三方库或旧系统。 2. 装饰器模式:动态地给对象添加一些额外的职责,提供了比继承更多的灵活性。 3. 代理模式:为其他对象提供一种代理以...
第4章 结构型模式 91 4.1 Adapter(适配器)—类对象结构型 模式 92 4.2 Bridge(桥接)—对象结构型 模式 100 4.3 Composite(组成)—对象结构型 模式 107 4.4 Decorator(装饰)—对象结构型 模式 115 4.5 FACADE...
这里我们主要关注的是"Java设计模式第二版源码",这可能是一个包含各种设计模式实现的代码库。 设计模式分为三类:创建型模式、结构型模式和行为型模式。创建型模式主要关注对象的创建过程,如单例模式(Singleton...
第四讲:工厂模式在开发中的运用 第五讲:单例模式 第六讲:原型模式 第七讲:建造者模式 第八讲:装饰模式 第九讲:策略模式 第十讲:观察者模式 第十一讲:享元模式 第十二讲:代理模式 第十三讲:外观...
4. 装饰器模式:动态地给一个对象添加一些额外的职责,可以扩展功能而不影响其他对象。 5. 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 其次,我们关注“体系结构”。软件体系结构是软件系统的高...
在第25讲中,他集中对整个系列进行了一次全面的总结,让我们一起来回顾和探讨这些设计模式的核心要点。 设计模式是经过实践验证的、在特定场景下解决常见问题的最佳解决方案。它们是面向对象设计的智慧结晶,通过...
1. **种类**:共有23种设计模式被记录在著名的《设计模式:可复用面向对象软件的基础》一书中,这些模式由Erich Gamma等四位作者提出,因此也被称为GOF设计模式。 2. **分类**:这23种模式可以根据其目的分为三大类...
- 装饰模式:动态地给一个对象添加一些额外的职责。 - 复合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。 4. **行为型设计模式** - 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到...
4. 装饰模式(Decorator Pattern):动态地给一个对象添加一些额外的职责。 5. 外观模式(Facade Pattern):为子系统中的一组接口提供一个统一的界面。 6. 享元模式(Flyweight Pattern):运用共享技术有效地支持...
4. 观察者模式:该模式用于定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。观察者模式在JavaScript事件处理中应用非常广泛。 5. 发布/订阅模式:这...
《Java设计模式》是刘伟老师的一本经典教材,它深入浅出地讲解了软件设计中的重要概念——设计模式。设计模式是经验丰富的开发者在解决常见问题时总结出的通用解决方案,是软件开发中的智慧结晶。这本书的课后习题和...