装饰器模式
装饰器模式(Decorator),动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更加灵活。
类图:
Component:定义一个组件接口,可以给这些对象动态的添加职责
ConcreteComponent:定义了一个具体的组件
Decorator:装饰接口,持有一个对组件的引用,从外类来扩展组件的功能。
ConcreteDecoratorA:具体的装饰对象,对组件进行装饰:
Component接口:
/* * @(#)Component.java 2014-3-30 */ package com.decorator; /** * 定义一个对象接口,可以给这些对象动态的添加职责 * @author liyan * @version 2014-3-30 * @since 1.0 */ public interface Component { public void opreation(); }
ConcreteComponent:
/* * @(#)ConcreteComponent.java 2014-3-30 */ package com.decorator; /** * 具体的对象 * @author liyan * @version 2014-3-30 * @since 1.0 * @see */ public class ConcreteComponent implements Component { @Override public void opreation() { System.out.println("具体的实现对象"); } }
Decorator:
/* * @(#)Decorator.java 2014-3-30 */ package com.decorator; /** * 装饰器接口,维持一个组件对象的引用 * @author liyan * @version 2014-3-30 * @since 1.0 * @see */ public class Decorator implements Component { protected Component component; public Decorator(Component component) { this.component = component; } @Override public void opreation() { component.opreation(); } }
装饰器A对象:
/* * @(#)ConcreteDecoratorA.java 2014-3-30 */ package com.decorator; /** * 描述当前类的作用 * @author liyan * @version 2014-3-30 * @since 1.0 * @see */ public class ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component component) { super(component); } @Override public void opreation() { System.out.println("ConcreteDecoratorA 装饰了当期组件"); // TODO Auto-generated method stub super.opreation(); } }
装饰器B对象:
package com.decorator; public class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) { super(component); } @Override public void opreation() { System.out.println("B装饰器的实现 装饰了组件对象"); super.opreation(); } }
实现测试:
/* * @(#)Test.java 2014-3-30 */ package com.decorator; /** * 描述当前类的作用 * @author liyan * @version 2014-3-30 * @since 1.0 * @see */ public class Test { public static void main(String[] args) { Component component = new ConcreteComponent(); //采用装饰器对组件进行“装饰” Decorator decoratorA = new ConcreteDecoratorA(component); Decorator decoratorB = new ConcreteDecoratorB(decoratorA); //调用A装饰器的装饰过程 decoratorA.opreation(); //同理调用B的 decoratorB.opreation(); } }
结果:
ConcreteDecoratorA 装饰了当期组件 具体的实现对象 B装饰器的实现 装饰了组件对象 ConcreteDecoratorA 装饰了当期组件 具体的实现对象
系统什么时候用装饰器:
当系统需要新增功能的时候,是向旧的类中添加新的代码。这些新增加的代码通常装饰了原有类的核心职责或者主要行为,在主类中加入新的字段,新的方法和新的逻辑,从而增加了主类的复杂度。而这些新增的东西仅仅是为了满足一些只有在特定情况下才会执行的特殊行为需求。装饰器为上述需求提供了一个较好的解决方案,它把每个要装饰的功能放在单独的类中,并让这些类包含它所要装饰的对象,因此,当需要执行特殊行为的时候,客户端代码可以在运行时候根据需要有选择的,按照顺序的使用装饰包装类(组件)。
2014/03/30 tsface 南京
hanily@msn.com
相关推荐
NULL 博文链接:https://alaric.iteye.com/blog/1911949
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 指定对象接口 9 1.6.4 描述对象...
C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...
设计模式之代理模式,请求的链式处理——职责链模式,请求发送者与接收者解耦——命令模式,自定义语言的实现——解释器模式,遍历聚合对象中的元素——迭代器模式,协调多个对象之间的交互——中介者模式,撤销功能...
前言过去我的一个朋友常说,学习...装饰器模式允许我们动态为对象添加行为。下面我们先介绍一个场景,然后寻找替代方法。这会帮助我们认清该模式的真实用途,尤其在灵活性这方面。思考过程今天我们参考的不是一个实际的
27.3.3 解释器模式使用的场景 27.3.4 解释器模式的注意事项 27.4 最佳实践 第28章 享元模式 28.1 内存溢出,司空见惯 28.2 享元模式的定义 28.3 享元模式的应用 28.3.1 享元模式优点和缺点 28.3.2 享元模式的应用 ...
4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2...
4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2...
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...
java和设计模式ppt包含工厂模式、建造模式、原始模型模式、单例模式、结构模式、适配器、桥梁模式、合成模式、装饰模式、门面模式、享元模式、代理模式、行为模式、解释器模式、迭代子模式、调停者模式、备忘录模式...
本文实例讲述了Python设计模式之装饰...设计模式——装饰模式 装饰模式(Decorator Pattern):动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 特点: 有效的把类的核心职责和装饰功能区
设计模式综合应用实例 设计模式综合应用实例 多人联机射击游戏 多人联机射击游戏中的设计模式应用(一) 多人联机射击游戏中的设计模式应用(二) 数据库同步系统 设计模式综合实例分析之数据库同步系统(一) 设计...
管理系统java sal源码 [toc] 设计模式 源码地址: 博客地址: 分类 ...Pattern)装饰器模式(Decorator Pattern)外观模式(Facade Pattern)享元模式(Flyweight Pattern)代理模式(Proxy Pattern)
1.2 Smalltalk MVC中的设计模式 1.3 描述设计模式 1.4 设计模式的编目 1.5 组织编目 1.6 设计模式怎样解决设计问题 1.7 怎样选择设计模式 1.8 怎样使用设计模式 第二章 实例研究:设计一个文档编辑器 2.1 设计问题...
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...
本文实例讲述了PHP设计模式之装饰器模式定义与用法。分享给大家供大家参考,具体如下: 装饰器模式: 如果已有对象的部分内容或功能性发生改变,但是不需要修改原始对象的结构或不使用继承,动态的扩展一个对象的...
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...
第7章 设计模式 单体模式 工厂模式 迭代器模式 装饰者模式 策略模式 外观模式 代理模式 中介者模式 观察者模式 小结 第8章 DOM和浏览器模式 关注分离 DOM脚本 事件 长期运行脚本 ...
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...