设计模式之装饰者模式

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

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

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

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

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


装饰者模式类图


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


package com.wdf.decorate;
/*
 * 饮料类
 * */
public abstract class Beverage {
	String description="Unknow Beverage";
	public String getDescription(){
		return description;
	}
	public abstract double cost();
}

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

package com.wdf.decorate;
/*
 * 浓缩咖啡
 * */
public class Espresso extends Beverage{
	public Espresso() {
		description="Espresso";
	}
	@Override
	public double cost() {
		return 1.99;
	}
}

package com.wdf.decorate;
/*
 * 深培咖啡
 * */
public class DarkRoast extends Beverage{

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

}

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();
	}

}

package com.wdf.decorate;

public class Test {
	public static void main(String[] args) {
		/*点一杯浓缩咖啡,什么都不加*/
		Beverage beverage=new Espresso();
		System.out.println(beverage.getDescription()+"$"+beverage.cost());
		/*点一杯深培咖啡,加双倍摩卡*/
		Beverage beverage2=new DarkRoast();
		beverage2=new Mocha(beverage2);
		beverage2=new Mocha(beverage2);
		System.out.println(beverage2.getDescription()+"$"+beverage2.cost());
	}
}

结果:

Espresso$1.99
DarkRoast,Mocha,Mocha$1.38

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值