设计模式:装饰者模式(Decorator Pattern)

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

在java的io中用的比较多

这里我们以蛋糕为例:

一、我们新建一个Cake接口

package com.kaishengit.decorator;

public interface Cake {
	public float cost();
}

二、新建一个蛋糕类(实现Cake接口)和一个装饰接口(继承Cake接口)

1>蛋糕类:

package com.kaishengit.decorator;

public class MilkCake implements Cake{

	@Override
	public float cost() {
		return 100f;
	}

}
 

2>装饰接口:

扫描二维码关注公众号,回复: 713422 查看本文章
package com.kaishengit.decorator;

public interface CakeDecorator extends Cake{
	
}

 三、新建两个装饰类,实现装饰接口

1>加草莓

package com.kaishengit.decorator;

public class Berry implements CakeDecorator{
	private Cake cake;
	public Berry(Cake cake){
		this.cake = cake;
	}

	@Override
	public float cost() {
		float berryPrice = 5f;
		return cake.cost() + berryPrice;
	}
}

 2>加巧克力

package com.kaishengit.decorator;

public class Chocolate implements CakeDecorator{
	private Cake cake;
	public Chocolate(Cake cake){
		this.cake = cake;
	}
	@Override
	public float cost() {
		float chocolatePrice = 20f;
		return cake.cost() + chocolatePrice;
	}

}

 四、测试

package com.kaishengit.decorator;

public class Test {
	public static void main(String[] args) {
		//牛奶蛋糕
		MilkCake mc = new MilkCake();
		
		//草莓牛奶蛋糕
		Berry b = new Berry(mc);
		System.out.println("付款:" + b.cost());
		
		//草莓巧克力牛奶蛋糕
		Chocolate c = new Chocolate(b);
		System.out.println("付款:" + c.cost());
	}
}

 运行结果:

付款:105.0

付款:125.0




装饰者模式特点:
1>继承属于扩展形式之一,但并不见得是弹性最好的最佳方式
2>在我们的设计中,应该允许行为可以被扩展,而无需修改现有的代码(开闭原则)
3>除了继承,使用装饰者模式也可以让我们扩展行为
4>装饰者可以在被装饰者的行为前面、后面加上自己的行为,甚至可以将被装饰者的行为取代,而达到特定的目的
5>装饰者模式会导致设计中出现许多小对象,如果过度使用,会让程序变得复杂

ok...

猜你喜欢

转载自meigesir.iteye.com/blog/1502655