装饰器模式(Decorator Pattern)又名包装模式(Wrapper Pattern)。装饰模式以对客户透明的方式扩展对象的功能,是继承关系的一种替代。换言之,客户端不会觉得对象在装饰前和装饰后有什么不同。
装饰器模式(Decorator Pattern)中的各个角色:
- 抽象构件(Componet)角色:给出一个抽象接口,规范准备接收附加责任的对象。
- 具体构件(Concrete Componet)角色:定义一个将要接收附加责任的类
- 装饰(Decorator)角色:持有一个构件(Componet)对象的实例,并定义一个与构件接口一致的接口
- 具体装饰(Concrete Decorator)角色:负责给构件对象贴上附加的责任
什么情况下需要使用装饰器模式:
- 需要扩展一个类的功能,或给一个类增加附加的责任
- 需要动态地给一个对象增加更能,这些功能可以动态地删除
- 需要增加一些基本功能的排列组合而产生非常大的功能,从而是关系继承变的不现实。
/** * 抽象构件 * @author zhangwei_david * @version $Id: Animal.java, v 0.1 2014年10月20日 下午10:13:25 zhangwei_david Exp $ */ public interface Animal { public void doStuff(); } /** *具体构件 * @author zhangwei_david * @version $Id: Rat.java, v 0.1 2014年10月20日 下午10:14:21 zhangwei_david Exp $ */ public class Rat implements Animal { /** * @see com.cathy.demo.pattern.composite.reflect.Animal#doStuff() */ public void doStuff() { System.out.println("Jerry will play with Tom."); } } /** *抽象装饰器角色 * @author zhangwei_david * @version $Id: Feature.java, v 0.1 2014年10月20日 下午10:14:59 zhangwei_david Exp $ */ public interface Feature { public void load(); } /** *具体装饰器角色 * @author zhangwei_david * @version $Id: FlyFeature.java, v 0.1 2014年10月20日 下午10:16:20 zhangwei_david Exp $ */ public class FlyFeature implements Feature { /** * @see com.cathy.demo.pattern.composite.reflect.Feature#load() */ public void load() { System.out.println("增加翅膀。。。。"); } } /** *具体装饰器角色 * @author zhangwei_david * @version $Id: DigFeature.java, v 0.1 2014年10月20日 下午10:17:13 zhangwei_david Exp $ */ public class DigFeature implements Feature { /** * @see com.cathy.demo.pattern.composite.reflect.Feature#load() */ public void load() { System.out.println("增加钻地能力。。。"); } } /** *装饰器反射实现类 * @author zhangwei_david * @version $Id: DecorateAnimal.java, v 0.1 2014年10月20日 下午10:18:06 zhangwei_david Exp $ */ public class DecorateAnimal implements Animal { private Animal animal; private Class<? extends Feature> clz; /** * @see com.cathy.demo.pattern.composite.reflect.Animal#doStuff() */ public void doStuff() { InvocationHandler handler = new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object obj = null; if (Modifier.isPublic(method.getModifiers())) { obj = method.invoke(clz.newInstance(), args); } animal.doStuff(); return obj; } }; ClassLoader cl = getClass().getClassLoader(); Feature proxy = (Feature) Proxy.newProxyInstance(cl, clz.getInterfaces(), handler); proxy.load(); } public DecorateAnimal(Animal animal, Class<? extends Feature> clz) { super(); this.animal = animal; this.clz = clz; } } /** * * @author zhangwei_david * @version $Id: TestClient.java, v 0.1 2014年10月20日 下午10:23:34 zhangwei_david Exp $ */ public class TestClient { public static void main(String[] args) { Animal jerry = new Rat(); jerry = new DecorateAnimal(jerry, FlyFeature.class); jerry = new DecorateAnimal(jerry, DigFeature.class); jerry.doStuff(); } }
结果是:
增加钻地能力。。。 增加翅膀。。。。 Jerry will play with Tom.
装饰器(Decorator)模式的优缺点:
- 装饰器模式(decorator Pattern)与继承关系的目的都是扩展对象的功能,但是装饰器模式可以提供比继承更多的灵活性。装饰器(Decorator)允许系统动态地决定贴上一个需要的装饰,或者除掉一个不必要的装饰。而继承关系则不同,继承关系是静态的,他在系统运行前就已经决定了。
- 通过使用不同的装饰器以及这些装饰器的排列组合,设计师可以创造出很多不同的行为的组合。
- 比继承更灵活也意味着笔比继承更容易出错。由于使用装饰器模式,可以比继承关系需更少的类。使用较少的类,当然使设计容易进行。但是,使用装饰器会比继承产生更多的对象。更多的对象会使得差错变得困难。
相关推荐
- 装饰器模式(Decorator) - 桥接模式(Bridge) - 组合模式(Composite) - 外观模式(Facade) - 享元模式(Flyweight) - 观察者模式(Observer) - 模板方法模式(Template Method) - 策略模式(Strategy) - 责任链...
主要为大家详细介绍了java设计模式之装饰器模式Decorator,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 代理模式(Proxy Pattern) 3 行为型模式 这些设计模式特别关注对象之间的通信。 责任链模式(Chain of ...
《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入...第27章 装饰器(decorator)模式 242 第28章 迭代器(iterator)模式 259 第29章 访问者(visitor)模式 278
pattern/src/structure/decorator //12.2装饰器模式 pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/...
主要介绍了Java设计模式之装饰模式(Decorator模式)介绍,本文讲解了为什么使用Decorator、如何使用装饰模式、Jive中的Decorator实现等内容,需要的朋友可以参考下
用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...
Decorator ( 装饰模式 ) Facade ( 外观模式 ) Flyweight ( 享元模式 ) Proxy ( 代理模式 ) Chain of Responsibility ( 责任链模式 ) Command ( 命令模式 ) Interpreter ( 解释器模式 ) Iterator ( 迭代器模式...
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在...
第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献
第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献
第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24章 桥接模式(Bridge) 第25章 访问者模式(Visitor) 附录A常见面向对象设计原则 附录BUML简介 参考文献
java 设计模式 源码 欢迎访问DesignPattern项目 ...装饰器模式(decoratorPattern) 外观模式(facadePattern) 享元模式(flyweightPattern) 代理模式(proxyPattern) 责任链模式(chainPattern) 命令模式(commandPatter
设计模式综合应用实例 设计模式综合应用实例 多人联机射击游戏 多人联机射击游戏中的设计模式应用(一) 多人联机射击游戏中的设计模式应用(二) 数据库同步系统 设计模式综合实例分析之数据库同步系统(一) 设计...
13、装饰模式DECORATOR PATTERN 14、迭代器模式ITERATOR PATTERN 15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21...
使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能...
2、结构模式:Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade (外观模式)。3、行为模式:Iterator(迭代模式)、Template(模板...
1. 设计模式 1.1 含义 1.2 作用 1.3 设计原则 1.4 分类 2. 简单工厂模式 (SimpleFactoryPattern) 3. 工厂方法模式 (Factory Method) 4. 单例模式 (Singleton) 5. 抽象工厂模式 (Abstract Factory) 6. ...
您必须实现装饰器模式,以便可以在运行时添加提到的服务。 作为开发服务如何工作的示例,在运行时创建一个用加密和缓存装饰的 JSON 策略,以及一个带有日志记录的 XML 策略。 请记住,您必须提供源代码和详细说明所...
1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 ...