设计模式之装饰者模式

装饰者模式 动态的将责任附加到对象上面。若要扩展功能,装饰者提供了比继承更有弹性的替代方案

1.装饰者与被装饰者对象有相同的父类

2.你可以用一个或者多个装饰者包装一个对象

3.因为装饰者与被装饰者具有相同的父类,所以在任何需要被包装对象的场合,都可以用装饰者代替

4.对象可以在任何时候被装饰,所以可以在运行时动态地,不限量地用你喜欢的装饰者来装饰对象


装饰者模式类图


下面要完成一个咖啡店的订购,顾客点一杯咖啡,可以选择咖啡里面什么都不加,或者加牛奶,加摩卡等等。。。根据不同的需求可以计算出饮料的价格

  1. package com.wdf.decorate;  
  2. /* 
  3.  * 饮料类 
  4.  * */  
  5. public abstract class Beverage {  
  6.     String description="Unknow Beverage";  
  7.     public String getDescription(){  
  8.         return description;  
  9.     }  
  10.     public abstract double cost();  
  11. }  
package com.wdf.decorate;
/*
 * 饮料类
 * */
public abstract class Beverage {
	String description="Unknow Beverage";
	public String getDescription(){
		return description;
	}
	public abstract double cost();
}


 

  1. package com.wdf.decorate;  
  2. /* 
  3.  * 抽象的装饰者基类 
  4.  * */  
  5. public abstract class CondimentDecorator extends Beverage{  
  6.     public abstract String getDescription();  
  7. }  
package com.wdf.decorate;
/*
 * 抽象的装饰者基类
 * */
public abstract class CondimentDecorator extends Beverage{
	public abstract String getDescription();
}


 

  1. package com.wdf.decorate;  
  2. /* 
  3.  * 浓缩咖啡 
  4.  * */  
  5. public class Espresso extends Beverage{  
  6.     public Espresso() {  
  7.         description="Espresso";  
  8.     }  
  9.     @Override  
  10.     public double cost() {  
  11.         return 1.99;  
  12.     }  
  13. }  
package com.wdf.decorate;
/*
 * 浓缩咖啡
 * */
public class Espresso extends Beverage{
	public Espresso() {
		description="Espresso";
	}
	@Override
	public double cost() {
		return 1.99;
	}
}


 

  1. package com.wdf.decorate;  
  2. /* 
  3.  * 深培咖啡 
  4.  * */  
  5. public class DarkRoast extends Beverage{  
  6.   
  7.     public DarkRoast() {  
  8.         description="DarkRoast";  
  9.     }  
  10.     @Override  
  11.     public double cost() {  
  12.         return 0.98;  
  13.     }  
  14.   
  15. }  
package com.wdf.decorate;
/*
 * 深培咖啡
 * */
public class DarkRoast extends Beverage{

	public DarkRoast() {
		description="DarkRoast";
	}
	@Override
	public double cost() {
		return 0.98;
	}

}


 

  1. package com.wdf.decorate;  
  2. /* 
  3.  * 调料摩卡 
  4.  * */  
  5. public class Mocha extends CondimentDecorator{  
  6.     Beverage beverage;//要被装饰的对象引用   
  7.     public Mocha(Beverage beverage) {  
  8.         this.beverage=beverage;  
  9.     }  
  10.     @Override  
  11.     public String getDescription() {  
  12.         return beverage.getDescription()+",Mocha";  
  13.     }  
  14.   
  15.     @Override  
  16.     public double cost() {  
  17.         return 0.20+beverage.cost();  
  18.     }  
  19.   
  20. }  
package com.wdf.decorate;
/*
 * 调料摩卡
 * */
public class Mocha extends CondimentDecorator{
	Beverage beverage;//要被装饰的对象引用
	public Mocha(Beverage beverage) {
		this.beverage=beverage;
	}
	@Override
	public String getDescription() {
		return beverage.getDescription()+",Mocha";
	}

	@Override
	public double cost() {
		return 0.20+beverage.cost();
	}

}


 

  1. package com.wdf.decorate;  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         /*点一杯浓缩咖啡,什么都不加*/  
  6.         Beverage beverage=new Espresso();  
  7.         System.out.println(beverage.getDescription()+"$"+beverage.cost());  
  8.         /*点一杯深培咖啡,加双倍摩卡*/  
  9.         Beverage beverage2=new DarkRoast();  
  10.         beverage2=new Mocha(beverage2);  
  11.         beverage2=new Mocha(beverage2);  
  12.         System.out.println(beverage2.getDescription()+"$"+beverage2.cost());  
  13.     }  
  14. }  
     

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值