[设计模式-结构型]装饰模式(Decorator)
2013-07-29 09:18
656 查看
概括
名称 | Decorator |
结构 | |
动机 | 动态地给一个对象添加一些额外的职责。就增加功能来说,D e c o r a t o r 模式相比生成子类更为灵活。 |
适用性 | 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 处理那些可以撤消的职责。 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。 |
解析
形象比喻:DECORATOR—Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦),再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?
1.Component
定义一个对象接口,可以给这些对象动态地添加职责。
2.ConcreteComponent
定义一个对象,可以给这个对象添加一些职责。
3.Decorator
维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。
4.ConcreteDecorator
向组件添加职责。
也就是说,不是用子类扩展的方式添加功能, 而使用另外一个装饰类,原类作为这个装饰类的一个属性。
实例
这里的实例是给软件产品(SoftwareProduct)两个装饰类(SoftwareDecoratorA,SoftwareDecoratorB)。涉及的文件:
Product.java
-- SoftwareProduct.java
Decorator.java
-- SoftwareDecoratorA.java
-- SoftwareDecoratorB.java
TestMain.java
/** * @author oscar999 * @date 2013-7-29 * @version V1.0 */ package designptn.decorator; public interface Product { void pack(); }
/** * @author oscar999 * @date 2013-7-29 * @version V1.0 */ package designptn.decorator; public class SoftwareProduct implements Product { @Override public void pack() { // TODO Auto-generated method stub System.out.println("Software Package"); } }
/** * @author oscar999 * @date 2013-7-29 * @version V1.0 */ package designptn.decorator; public abstract class Decorator implements Product { protected Product product; public void setProduct(Product product) { this.product = product; } @Override public void pack() { // TODO Auto-generated method stub product.pack(); } }
/** * @author oscar999 * @date 2013-7-29 * @version V1.0 */ package designptn.decorator; public class SoftwareDecoratorA extends Decorator { public void pack() { super.pack(); rePack(); System.out.println("SoftwareDecoratorA"); } public void rePack() { System.out.println("Package Again"); } }
/** * @author oscar999 * @date 2013-7-29 * @version V1.0 */ package designptn.decorator; public class SoftwareDecoratorB extends Decorator { public void pack() { super.pack(); System.out.println("SoftwareDecoratorB"); } }
/** * @author oscar999 * @date 2013-7-29 * @version V1.0 */ package designptn.decorator; public class TestMain { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Product product = new SoftwareProduct(); SoftwareDecoratorA sd1 = new SoftwareDecoratorA(); SoftwareDecoratorB sd2 = new SoftwareDecoratorB(); sd1.setProduct(product); sd2.setProduct(product); sd1.pack(); sd2.pack(); } }
相关文章推荐
- 结构型设计模式---Decorator模式(装饰模式)
- 【设计模式】结构型模式之装饰器Decorator
- 十二.结构型设计模式——Decorator Patten(装饰模式)
- 设计模式23---设计模式之装饰模式(Decorator)(结构型)
- 设计模式09: Decorator 装饰模式(结构型模式)
- 设计模式十:decorator(装饰)——对象结构型模式
- Java设计模式(9)——结构型模式之装饰模式(Decorator)
- 设计模式-结构型-装饰模式(Decorator)
- 设计模式笔记 9.Decorator 装饰模式(结构型模式)
- 设计模式--装饰器模式Decorator(结构型)
- 设计模式(八)装饰器模式Decorator(结构型)
- 设计模式之十四:Decorator(装饰)—对象结构型模式
- Java设计模式之结构型模式-装饰器模式(Decorator)
- [导入]C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式).zip(9.84 MB)
- 设计模式(八)装饰器模式Decorator(结构型)
- 设计模式中结构型模式(四)装饰模式(Decorator)
- C#面向对象设计模式第十讲:Decorator 装饰模式(结构型模式)
- "围观"设计模式(13)--结构型之装饰模式(Decorator Pattern)
- [设计模式-结构型]装饰模式(Decorator)
- C#设计模式之八装饰模式(Decorator Pattern)【结构型】