结构型设计模式---Decorator模式(装饰模式)

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




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值