装饰模式是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
分享到:
相关推荐
“[设计模式]在实用环境下特别有用,因为它分类描述了一组设计良好,表达清楚的面向对象软件设计模式。整个设计模式领域还很新,本书的四位作者也许已占据了这个领域造诣最深的专家中的半数,因而他们定义模式的方法...
c# ,设计模式,装饰者模式,星巴兹咖啡,基本上就是head first 上的例子的C#实现,根据自己的理解,作了一点点改动,可以直接运行。
9 装饰模式 10 原型模式 11 委派模式 12 适配器模式 设计模式综合运用 1 门面+模版方法+责任链+策略 2 门面+模版方法+责任链+策略+工厂方法 3 动态代理+Spring AOP 4 责任链模式进阶 Spring Framework设计模式 ...
结构型设计模式:适配器模式,桥接模式,组合模式,装饰模式,外观模式,轻量级模式,代理模式; 行为性设计模式:责任链模式,命令模式,解释器模式,迭代器模式,中介者模式,备忘录模式,观察者模式,状态模式,...
2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略...
设计模式--装饰者模式java例子
Java描述设计模式:装饰模式 10 Java描述设计模式:组合模式 11 Java描述设计模式:观察者模式 12 Java描述设计模式:外观模式 13 Java描述设计模式:迭代器模式 14 Java描述设计模式:解释器模式 15 Java描述设计...
设计模式 c# 装饰模式
根据售卖咖啡的过程,客户先选择一种口味的咖啡,又选择不同种类的配料,由于配料选择是不定的,符合装饰模式的应用情况。
软件设计模式之装饰模式讲解ppt,可用于教学课件。
java设计模式之装饰者模式代码
设计模式面面观(12):装饰模式(Decorator Pattern)-结构型模式
C++23种设计模式之 装饰模式。:当你向旧的类中添加新代码时,一般是为了添加核心职责或主要行为。而当需 要加入的仅仅是一些特定情况下才会执行的特定的功能时(简单点就是不是核心应用的功 能),就会增加类的...
设计模式 - 装饰模式(C++实例) 若有问题,请指出。
54-Spring设计模式之装饰器模式1
书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...
java设计模式的精简版,创建型模式:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式共五种; 结构型模式:适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式共七种。 行为型...
装饰模式是Erich Gamma等人所著的《设计模式:可利用面向对象软件的基础》一书中众多模式之一。一般来说,此模式在设计Swing的程序员中比较流行,他们用它来改进软件。今天,即使有许多程序是基于Web应用的,装饰...
JAVA设计模式之装饰模式代码
4装饰器模式:用到原来类的方法并且添加新的属性装饰器模式:用到原来类的方法并且添加新的属性 设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板全文共22页,当前为第5页。 5代理模式:类似装饰器模式,...