参考网站
http://www.runoob.com/design-pattern/factory-pattern.html
什么是装饰器模式?
装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构性模式,他是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
下面的这个例子,就是对一块面包进行装饰。面包大同小异,但是它有不同的口味,如美式面包,法式面包等等。就是通过在同一块普通面包的基础上进行装饰,因为口味不同,有的加的东西又不一样。但是通过装饰器模式就能很好地解决这种问题。
使用方法
动态的给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
步骤
创建一个接口
Bread.java 面包类
public interface Bread {
public void show();//面包显示
}
创建需要装饰的实体类
AmericanBread.java 美式面包
public class AmericanBread implements Bread {
private double money = 5.2;
@Override
public void cost() {
// TODO Auto-generated method stub
}
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println("AmericanBread");
}
}
创建实现了面包接口的装饰器类
BreadDecorator.java 面包装饰器类
public class BreadDecorator implements Bread {
private Bread bread;
public BreadDecorator(Bread bread) {
this.bread = bread;
// TODO Auto-generated constructor stub
}
@Override
public void show() {
// TODO Auto-generated method stub
bread.show();
}
}
创建拓展了BreadDecorator类的实体装饰类
GarlicDecorator.java 大蒜装饰类
public class GarlicDecorator extends BreadDecorator{
public GarlicDecorator(Bread bread){
super(bread);
addGarlic(bread);
}
public void addGarlic(Bread bread){
System.out.println("加蒜");
}
}
客户端使用GarlicDecorator类来装饰Bread对象
Client.java 客户端类
public class Client {
public static void main(String ars[]){
Bread americanBread = new AmericanBread();
Bread garlicAmericanBread = new GarlicDecorator(americanBread);
garlicAmericanBread.show();
}
}
网友评论