装饰模式(别名:包装器)
动态地给对象添加一些额外的职责。就功能来说装饰模式相比生成子类更为灵活。装饰( Decorator )模式又叫做包装模式。通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。装饰模式是动态地扩展一个对象的功能,而不需要改变原始类代码的一种成熟模式。在装饰模式中,“具体组件”类和“具体装饰”类是该模式中的最重要的两个角色。
装饰模式的类图;
鸡腿堡·实例:
现在需要一个汉堡,主体是鸡腿堡,可以选择添加生菜、酱、辣椒等等许多其他的配料,并根据选择的配料计算相应的价格。
首先画出类图:
代码如下:组件 humburger:
package humburger;
public interface humburger {
public String description();
public int price();
}
具体组件 jituihb:
public class jituihb implements humburger {
private String description;
private int price;
public String description(){
return description="鸡腿堡";
}
public int price(){
return 10;
}
}
装饰者:Decorator:
package humburger;
public abstract class Decorator implements humburger {
private humburger humburger;
public abstract String description();
public int price(){
return 0;
}
}
具体装饰者:cai,lajiao,jiang
package humburger;
public class cai extends Decorator {
private humburger humburger;
private int price;
private String description;
public cai(humburger humburger) {
this.humburger=humburger;
}
public String description(){
return humburger.description()+"加菜";
}
public int price(){
return humburger.price()+1;
}
}
package humburger;
public class lajiao extends Decorator {
private humburger humburger;
private int price;
private String description;
public lajiao(humburger humburger) {
this.humburger=humburger;
}
public String description(){
return humburger.description()+"加辣椒";
}
public int price(){
return humburger.price()+3;
}
}
package humburger;
public class jiang extends Decorator {
private humburger humburger;
private int price;
private String description;
public jiang(humburger humburger) {
this.humburger=humburger;
}
public String description(){
return humburger.description()+"加酱";
}
public int price(){
return humburger.price()+2;
}
}
然后我们来在Test的类中具体的实现:
package humburger;
public class Test {
public static void main(String[] args) {
humburger humburger=new jituihb();
System.out.println(humburger.description()+"价钱:"+humburger.price()+"元");
cai cai=new cai(humburger);
System.out.println(cai.description()+"价钱:"+cai.price()+"元");
jiang jiang=new jiang(humburger);
System.out.println(jiang.description()+"价钱:"+jiang.price()+"元");
lajiao lajiao=new lajiao(humburger);
System.out.println(lajiao.description()+"价钱:"+lajiao.price()+"元");
这样我们的Java设计模式的装饰者模式----为鸡腿堡加料并且加上对应的价钱,就设计好了。用这样的模式体现了松耦合的特点,也易于扩充。
最后附上运行结果图: