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

原创 2007年09月20日 16:07:00

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




版权声明:本文为博主原创文章,未经博主允许不得转载。

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

尽管目前房价依旧很高,但还是阻止不了大家对新房的渴望和买房的热情。如果大家买的是毛坯房,无疑还有一项艰巨的任务要面对,那就是装修。对新房进行装修并没有改变房屋用于居住的本质,但它可以让房子变得更漂亮、...

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

在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象...

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

概述动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。可以简称为"修修补补"适用性1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 ...
  • iihero
  • iihero
  • 2012年11月20日 20:07
  • 1635

"围观"设计模式(13)--结构型之装饰模式(Decorator Pattern)

修饰模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式。就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。----WIKIPEDIA ...

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

职责: 动态的为一个对象增加新的功能。 装饰模式是一种用于代替继承的技术,无须通过继承增加之类就能扩展对象的新功能。 使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。 实现...

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

意图: 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活。 个人理解: 结合代码注释理解。 适用性:在不影响其他对象的情况下,以动态、透明的方...

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

(C++设计模式) ------装饰模式-- 结构型模式 设计模式的学习是一个循序渐进的过程,每一个设计师都是在套用这几种设计模式来实现自己的软件构架,很多都是融合会贯通的,一个设计模式中不仅仅是用到...

设计模式深入学习---Decorator装饰模式(结构型模式)

我们先理解下什么情况会用到Decorator装饰模式。      比如我们设计一个游戏人物,人物拥有的装扮,如衣服,裤子,靴子,手套,戒指,帽子 等 这些类型的开发,又或者是设计一个部件,比如一个武器...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:结构型设计模式---Decorator模式(装饰模式)
举报原因:
原因补充:

(最多只允许输入30个字)