装饰模式是对对象功能增强时,平时使用继承的一种替代方案
一.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();
}
}
四.总结
优点:装饰模式和继承都是对功能的扩展,而装饰模式使用的是组合,可以不用继承而达到这一效果.使用过多的继承会增加系统的复杂性和偶合性
缺点:装饰模式要产生一些辅助性的对象,但这些对象看上去都比较像,不是很容易检查(好的命名应该是提高检查的一个办法)
分享到:
相关推荐
装饰者模式是面向对象设计中的一种行为模式,它允许在运行时给对象添加新的行为或职责,而无需改变其原始类。这种模式的核心思想是通过将对象包装在一个装饰类中来扩展其功能,装饰类与被装饰类具有相同的接口,因此...
装饰者模式(Decorator)是一种设计模式,用于在运行时动态地给对象添加额外的责任或功能。它是结构型设计模式的一种,能将行为的增加与对象的创建分离,使得我们可以独立地扩展对象的功能。 在Java或其他面向对象...
- **ConcreteComponent(具体组件)**:实现了Component接口的类,是装饰模式要装饰的目标对象。它定义了初始行为,不包含任何额外装饰。 - **Decorator(装饰者)**:持有对Component对象的引用,并且实现...
装饰模式是一种结构型设计模式,它允许在运行时给对象添加新的行为或责任,而无需修改对象的源代码。这种模式通过将附加功能封装到一个称为装饰者的对象中来实现,使得原有的对象类保持不变,扩展了其功能。在软件...
适配器模式、装饰模式和代理模式 本文将详细介绍适配器模式、装饰模式和代理模式的概念、特点和应用场景,并通过实际的例子来阐述这三种模式的差异和相同点。 一、适配器模式 适配器模式是一种结构型设计模式,它...
装饰模式是一种结构型设计模式,它允许我们向一个对象添加新的功能或改变其行为,而无需修改原有对象的代码。这种模式在不破坏封装性的前提下,动态地给对象增加功能,提高了系统的可扩展性和可维护性。装饰模式通常...
装饰者模式是一种设计模式,属于结构型模式,它在不改变对象自身的基础上,动态地给对象添加一些职责或行为。这种模式通常用于当对现有对象的功能进行扩展时,避免对对象进行子类化,以此来减少类的爆炸性增长和提高...
Decorator模式,也称为装饰模式,是设计模式中的一个重要组成部分,它在不改变原有对象接口的前提下,动态地给对象添加新的功能,从而扩展了对象的能力。这篇博客()将深入探讨这个模式的细节。 装饰模式的核心...
近年来,高职建筑装饰专业在教学模式上进行了一系列的改革,其中翻转课堂作为一种新型的教学模式受到了越来越多的关注。高职建筑装饰CAD翻转课堂教学模式的实践,不仅改变了传统的教学观念,还提高了教学质量,探索...
装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时给对象添加新的行为或职责,而无需改变对象的类。在Java中,装饰模式通常通过继承和组合来实现,使得代码具有更好的扩展性和灵活性。...
装饰器模式是一种设计模式,它的主要目的是在不修改已有对象的基础上,动态地为对象增加新的功能。这种模式在软件工程中被广泛应用,特别是在需要扩展功能而又不希望改动原有代码的情况下,装饰器模式提供了很好的...
作为一种结构型模式, 装饰器(Decorator)模式就是对一个已有结构增加”装饰”. 适配器模式, 是为现在有结构增加的是一个适配器类,.将一个类的接口,转换成客户期望的另外一个接口.适配器让原本接口不兼容的类可以很好...
"深入浅出设计模式三——Beverage实现(装饰者模式)"这一标题指出,我们将探讨如何使用装饰者模式来实现一个饮品系统。装饰者模式是一种结构型设计模式,它允许我们在运行时向对象添加新的行为或职责,而无需修改对象...
装饰器模式是一种编程模式,它允许用户在不修改原有对象的基础上,动态地给某个对象添加额外功能。在KOA2中,装饰器模式主要应用于中间件的创建和使用,利用JavaScript的高阶函数和闭包特性,可以非常灵活地编写...
中国建筑装饰行业电子商务模式研究 电子商务模式对中国建筑装饰行业的影响 中国建筑装饰行业作为一个传统的行业,近年来随着互联网技术的发展和消费者需求的不断变化,逐渐呈现出向电子商务模式转型的趋势。电子...
11. **装饰模式**:装饰者模式为对象动态地添加职责,它可以在运行时增加或减少对象的功能,而不会影响到其他对象。 12. **享元模式**:运用共享技术有效地支持大量细粒度的对象。在C#中,可以使用静态成员或缓存来...
本书《您的设计模式》对设计模式进行了详细的讲解,涵盖了策略模式、代理模式、单例模式、多例模式、工厂方法模式、抽象工厂模式、门面模式、适配器模式、模板方法模式、建造者模式、桥梁模式、命令模式、装饰模式、...
在本文中,我们将深入探讨标题提及的23种设计模式,并着重讨论桥接模式与适配器模式、装饰模式与代理模式、状态模式与策略模式,以及工厂模式之间的差异。 1. **桥接模式与适配器模式**: - **桥接模式**:将抽象...