装饰模式是Java IO中使用到的一个主要的设计模式,又称为包装(Wrapper)模式。
装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,以对客户端透明的方式动态的给一个对象附加上更多的责任和功能,但在添加这些额外的职责时不会控制该类的执行逻辑。
装饰模式可以在不创造更多的子类的模式下,将对象的功能加以扩展。那么,装饰模式与类继承有何区别呢?!区别有以下两点:
●装饰模式是一种动态行为,是对已有类的组合;而类的继承是一种静态的行为,一个类定义成什么样的,该类的对象便具有什么样的功能,无法动态的改变;
●装饰模式扩展的是在不改变由于对象的情况下扩展对象功能,而不增加类的数量,不会导致类爆炸;而类继承扩展是类的功能,在继承的关系中,如果我们想增加一个对象的功能,我们只能通过继承关系,在子类中增加两个方法。
装饰模式符合OOP六个设计原则中的“开闭原则”,即对修改关闭,对扩展开放。
还有,装饰模式和之前学习过的动态代理模式很像,但是二则的意图是不同的:
动态代理模式是由代理对象对外部提供对被代理对象的访问控制,如权限控制、事物控制和其他的一些前置或后置控制;而装饰模式是在不改变对象的逻辑行为的情况下一通明的方式给对象附加上更多的责任和功能。
下面我们来看一下装饰模式的类图:
装饰模式的构成:
●抽象构建角色(Component):给出一个抽象的接口,以规范准备接受附加责任的对象。相当于i/o流里面InputStream/OutputStream和Reader/Writer。
●具体的构建角色(ConcreteComponent):定义一个将要接受附加责任的类。相当于i/o里面的FileOutputStream和FileInputStream。
●装饰角色(Docorator):持有一个抽象构建(Component)角色的引用,并定义一个与抽象构件一致的接口。相当于i/o里面的FilerOutputStream和FilterInputStream。
●具体的装饰角色(ConcreteDecorator):负责给构建对象“贴上”附加的责任。相当于i/o流里面的BufferedOutputStream和BufferedInputStream以及DataOutputStream和DataInputSrtream。
package org.pattern.decorator;
/**
* 接口,具体的装饰类和被装饰则都要这几该接口
* @author JackyChen
*
*/
public interface Component {
/**
* 化妆操作
*/
void makeup();
}
package org.pattern.decorator;
/**
* 具体的原始功能类,要被其他类装饰
* @author JackyChen
*
*/
public class ConcreteComponent implements Component {
@Override
public void makeup() {
System.out.println("化妆!");
}
}
package org.pattern.decorator;
/**
* 装饰角色(Docorator):持有一个抽象构建(Component)角色的引用,
* 并定义一个与抽象构件一致的接口
* @author JackyChen
*
*/
public class Decorator implements Component{
private Component component;
public Decorator(Component component){
this.component = component;
}
@Override
public void makeup() {
this.component.makeup();
}
}
package org.pattern.decorator;
/**
* 具体装饰角色,给被装饰则添加”换衣服“的功能
* @author JackyChen
*
*/
public class DressUpDecorator extends Decorator{
public DressUpDecorator(Component component) {
super(component);
}
@Override
public void makeup() {
super.makeup();
this.dressUp();
}
private void dressUp(){
System.out.println("换衣服!");
}
}
package org.pattern.decorator;
/**
* 具体装饰角色,给被装饰则添加”撒香水儿“的功能
* @author JackyChen
*
*/
public class PerfumeDecorator extends Decorator{
public PerfumeDecorator(Component component) {
super(component);
}
@Override
public void makeup() {
super.makeup();
this.perfume();
}
private void perfume(){
System.out.println("撒香水儿!");
}
}
package org.pattern.decorator;
public class DocoratorExample {
public static void main(String[] ags){
//1,本来ConcreteComponent对象只是想化化妆
//2,通过DressUpDecorator包装类给ConcreteComponent对象添加了“换装”功能
//3,又通过PerfumeDecorator包装类给ConcreteComponent对象添加了“撒香水儿”功能
Component component = new PerfumeDecorator(
new DressUpDecorator(new ConcreteComponent()));
component.makeup();
}
}
再看DocoratorExample的执行结果:
化妆!
换衣服!
撒香水儿!
- 大小: 10.1 KB
分享到:
相关推荐
设计模式分为三类:创建型模式(如单例模式、工厂方法模式)、结构型模式(如代理模式、装饰器模式)和行为型模式(如观察者模式、策略模式)。每种模式都有其特定的用途和适用场景。 4. **具体设计模式详解** - ...
8. 装饰模式(Decorator):动态地给一个对象添加一些额外的职责。装饰者模式可以用来扩展功能,而无需修改原有代码。 9. 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。代理模式常用于远程...
### 设计模式:可复用面向对象软件的基础 #### 书籍概述 《设计模式:可复用面向对象软件的基础》是一本由Erich Gamma、Richard Helm等四位国际知名的软件工程师共同编写的经典之作,该书提供了面向对象软件设计中...
总之,《设计模式:基于C#的工程化实现及扩展》是一本对于C#开发者来说非常有价值的参考资料,它不仅讲解了设计模式的理论,还提供了丰富的实践案例,帮助读者掌握如何在实际项目中应用这些模式,提升软件开发的专业...
“[设计模式]在实用环境下特别有用,因为它分类描述了一组设计良好,表达清楚的面向对象软件设计模式。整个设计模式领域还很新,本书的四位作者也许已占据了这个领域造诣最深的专家中的半数,因而他们定义模式的方法...
- 装饰模式:为游戏对象动态增加功能,如给角色动态增加装甲或魔法效果等; - 代理模式:用于控制对游戏资源的访问,如延迟加载或异步加载资源。 通过应用设计模式,游戏引擎开发者能够更好地实现软件的复用性、可...
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。这些模式通过前人的经验总结,为开发人员提供了一种标准化的解决方案,使得代码更易于理解、扩展和维护。本资源《设计模式:可...
总的来说,《设计模式:可复用面向对象软件的基础》是一本深入理解和应用面向对象设计的必备书籍,它不仅介绍了23种核心设计模式,还提供了大量实例和解释,帮助读者将理论知识转化为实际的编程技巧。通过对这本书的...
Spring 设计模式之装饰器模式详解 在软件设计中,经常会遇到需要在不修改原有代码的情况下,添加新的功能或行为。这时,装饰器模式便可以发挥其作用。在 Spring 设计模式中,装饰器模式是非常重要的一种设计模式。 ...
在"设计模式之装饰模式:以售卖咖啡为例"的场景中,我们可以详细解析其应用。 首先,咖啡的选择过程可以看作是基础产品(Component),例如原味咖啡。客户可以选择的基础咖啡类型可能包括拿铁、卡布奇诺等,这些都...
装饰者模式是面向对象设计模式中的一个重要概念,它在C#等编程语言中广泛应用。这个例子以星巴克咖啡为例,展示了如何使用装饰者模式来灵活地扩展对象的功能,而无需修改原有代码。 装饰者模式的核心思想是动态地将...
《设计模式:基于C#的工程化实现及扩展》是一份深入探讨软件设计模式的宝贵资源,它提供了C#语言下的具体实现与扩展,旨在帮助开发者提升代码的可读性、可维护性和可复用性。这个压缩包包含了多个源码文件,分别命名...
装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...
9. 装饰模式:装饰模式动态地给对象添加一些额外的职责,提供比继承更具有弹性的扩展方式。 10. 外观模式:外观模式为复杂的子系统提供了一个简单的接口,简化了客户端代码。 11. 享元模式:享元模式通过共享技术...
在《设计模式:可复用面向对象软件的基础》一书中,作者Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides(通常被称为GoF,Gang of Four)详细阐述了23种经典的设计模式。这些模式分为三类:创建型模式、...
4. 装饰模式:动态地给一个对象添加一些额外的职责,增加功能而不改变其原有结构。 5. 外观模式:为复杂的子系统提供一个简单的接口。 6. 享元模式:运用共享技术有效地支持大量细粒度的对象。 7. 代理模式:为其他...
装饰模式是一种设计模式,它是结构型模式的一种,用于在运行时动态地给对象添加新的行为或职责。这种模式允许我们独立于对象的类来扩展其功能,而不必修改原有代码,实现了对对象的透明增强。装饰模式的核心在于,它...
- 装饰模式:动态地给对象添加一些额外的职责,为对象添加新的行为或属性而不改变其结构。 - 外观模式:提供一个统一的接口,用来访问子系统中的多个接口。 - 代理模式:为其他对象提供一种代理以控制对这个对象...