装饰者模式(Decorator Pattern)

终于把学了好多天的装饰者模式敲了一边,这里记录下来,供以后参考。

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

我自己的理解为,就是一组继承同一个抽象类的组合,然后一个把另一个作为成员变量,给包裹起来,也就是装饰起来,因为抽象类里里有共同的抽象方法,所有包装着在自己的方法中,先调用被包装的方法,然后在之上加上自己的属性。

装饰者和被装饰者都要来自同一个抽象类!!!

只是敲了一下例子程序,具体的如果在项目中用到我会再加上来,用一个饮料例子来介绍:

饮料的抽象类,提供抽象的cost()方法。

public abstract class Beverage {
	
	String description;
	
	public String getDescription() {
		return description;
	}
	
	public abstract double cost();
}


一个混合咖啡:
public class HousBlend extends Beverage{

	public HousBlend() {
		description = "HousBlend Cofee";
	}
	
	@Override
	public double cost() {
	
		return 10;
	}

}

咖啡的调料抽象类:

public abstract class CondimentDecorator extends Beverage{
	public abstract String getDescription();
}

具体的调料,在构造方法中将被装饰者作为成员变量包裹在内:

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 beverage.cost() + 1;
	}

}

测试的例子:

public class Test {
	public static void main(String args[]) {
		Beverage coffee = new HousBlend();
		System.out.println(coffee.getDescription() + "," +coffee.cost()+ "元");
		
		coffee = new Mocha(coffee);
		coffee = new Mocha(coffee);
		System.out.println(coffee.getDescription()+ "," +coffee.cost()+ "元");
		
		coffee = new Mocha(coffee);
		System.out.println(coffee.getDescription()+ "," +coffee.cost()+ "元");
	}
}

显示的结果:

HousBlend Cofee,10.0元
HousBlend CofeeMochaMocha,12.0元
HousBlend CofeeMochaMochaMocha,13.0元


因为还没具体用到,所以理解不是很深刻,但是知道了这种模式,以后碰到用这种模式的时候会接受更快。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值