第四个设计模式:装饰模式
装饰模式是对对象功能增强时,平时使用继承的一种替代方案
一.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. 发布/订阅模式:这...
4. **装饰器模式**:动态地给一个对象添加一些额外的职责,既保留了原有类的行为,又可以扩展其功能,避免使用继承带来的复杂性。 5. **适配器模式**:将两个不兼容的接口通过适配器进行转换,使得原本不能一起工作...