Decorator模式(装饰模式):Decorator本义是油漆工的意思,也就是在你的东东外表上不断地刷上不同颜色。Decorator模式描述了如何动态地为对象添加职责。采用递归方式组合对象,允许添加任意多的对象职责。
例如:咖啡店需要卖各种咖啡:加糖的、加冰的、加奶的、加巧克力的等。顾客要买咖啡,他可以往咖啡里加任意的一种或几种调料的咖啡。
我们要算出不同组合咖啡的价格。如何设计呢?
首先我们把加不同的东西分别写成类,然后根据不同构造来组合。代码如下:
interface Product
{
public double money();
}
//咖啡类
class Coffee implements Product
{
public double money() {
return 12;
}
}
//加糖类:
class Sugar implements Product
{
private Product product;
public Sugar(Product product)
{
this.product=product;
}
public double money() {
//传递进来的对象价格+本类的价格
return product.money()+2;
}
}
//加冰类:
class Ice implements Product
{
private Product product;
public Ice(Product product)
{
this.product=product;
}
public double money() {
//传递进来的对象价格+本类的价格
return product.money()+1.5;
}
}
//加奶类
class Milk implements Product
{
private Product product;
public Milk(Product product)
{
this.product=product;
}
public double money() {
//传递进来的对象价格+本类的价格
return product.money()+4.0;
}
}
//加巧克力类
class Chocolate implements Product
{
private Product product;
public Chocolate(Product product)
{
this.product=product;
}
public double money() {
//传递进来的对象价格+本类的价格
return product.money()+5.5;
}
}
public class Decorator {
public static void main(String[] args) {
//如果顾客想要咖啡,输出咖啡的价格
Product obj1=new Coffee(); //子类赋给父类
System.out.println(obj1.money());
//如果顾客想要加冰咖啡,输出咖啡的价格+加冰价格
Product obj2=new Ice(new Coffee());
System.out.println(obj2.money());
//如果顾客想要加糖,加冰,加奶,加巧克力的咖啡
Product obj3=new Chocolate(new Milk(new Ice(new Sugar(new Coffee()))));
System.out.println(obj3.money());
}
}
输出:
12.0
13.5
25.0
一句话,就是把附加的操作独立出来,使用的时候可以任意递归组合。达到为对象添加功能
上面的写法,是把装饰类和产品写一起了,用起来方便些,也可以把产品类,和装饰类分开来写。如下:
interface Product
{
public double money();
}
//产品1:咖啡类
class Coffee implements Product
{
public double money() {
System.out.println("咖啡的价格是:12");
return 12;
}
}
//产品2:加糖类:
class Sugar implements Product
{
public double money() {
System.out.println("糖价格是:2");
return 2;
}
}
//产品3:加冰类:
class Ice implements Product
{
public double money() {
System.out.println("冰价格是:1.5");
return 1.5;
}
}
//产品4:加奶类
class Milk implements Product
{
public double money() {
System.out.println("奶价格是:4.0");
return 4.0;
}
}
//产品5:加巧克力类
class Chocolate implements Product
{
public double money() {
System.out.println("巧克力价格是:5.5");
return 5.5;
}
}
//装饰类,传给我什么产品,我就说出该产品的价格
class Decorator implements Product{
private Product product;
public Decorator(Product product)
{
this.product=product;
}
public double money() {
return product.money();
}
}
public class TestDec{
public static void main(String[] args) {
Product p1=new Decorator(new Coffee());
Product p2=new Decorator(new Sugar());
Product p3=new Decorator(new Ice());
Product p4=new Decorator(new Milk());
Product p5=new Decorator(new Chocolate());
//如果顾客想要加糖,加奶的咖啡
System.out.println(p1.money()+p2.money()+p4.money());
//如果顾客想要加糖,加冰,加奶,加巧克力的咖啡
System.out.println(p1.money()+p2.money()+p3.money()+p4.money()+p5.money());
}
}
运行结果:
咖啡的价格是:12
糖价格是:2
奶价格是:4.0
18.0
咖啡的价格是:12
糖价格是:2
冰价格是:1.5
奶价格是:4.0
巧克力价格是:5.5
25.0