概括
名称 | 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();
}
}