关闭

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

780人阅读 评论(0) 收藏 举报

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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1065689次
    • 积分:14612
    • 等级:
    • 排名:第849名
    • 原创:313篇
    • 转载:266篇
    • 译文:0篇
    • 评论:239条
    最新评论