您的位置:首页 > 其它

[设计模式-结构型]装饰模式(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();
}

}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: