有关装饰者模式的两三事

举例:
蛋糕店 能够生产格式各样的蛋糕
蛋糕分为 三种 : 奶油蛋糕 ,巧克力蛋糕, 冰淇淋蛋糕
然后再上面可以添加 鲜花 水果 贺卡 干果 饼干…
不同的人可以定做不同的蛋糕,有不同的选项
蛋糕店用不用将所有选项的排列组合的蛋糕都准备一遍???没有必要!!!
蛋糕制作接口:

 abstract class Cake{
	 public abstract void make(); 
 }

选择口味:

 class ChocklateCake extends Cake{
	public void make() {
		System.out.println("制作了一个巧克力蛋糕");
	}	 
 }
 class CreamCake extends Cake{
	public void make() {
		System.out.println("制作了一个奶油蛋糕");
	}		 
}
 class IcecreamCake extends Cake{
	public void make() {
		System.out.println("制作了一个冰淇淋蛋糕");
	}		 
}

添加饰品:

class CardDecorator extends Decorator{

	public CardDecorator(Cake cake) {
		super(cake);
		
	}
	public void make(){
		super.make();
		System.out.println("放入一张card");
	}
 }
 class FruitDecorator extends Decorator{

	public FruitDecorator(Cake cake) {
		super(cake);
	}
	public void make(){
		super.make();
		System.out.println("放上一点水果");
	}
 }
 class NutDecorator extends Decorator{

	public NutDecorator(Cake cake) {
		super(cake);
	}
	public void make(){
		super.make();
		System.out.println("放上一点干果");
	}
 }

测试代码:

public static void main(String[] args) {
		Cake cake=new ChocklateCake();
		FruitDecorator fd=new FruitDecorator(cake);
		NutDecorator nd=new NutDecorator(fd);
		CardDecorator cd=new CardDecorator(nd);
		cd.make();
	}
	结果:
	制作了一个巧克力蛋糕
	放上一点水果
	放上一点干果
	放入一张card

总结:

优点:

  • 装饰类和被装饰类是可以独立的,低耦合的。互相都不用知道对方的存在
  • 装饰模式是继承的一种替代方案,无论包装多少层,返回的对象都是is-a的关系(上面的例子:包装完还是Phone类型)。
  • 实现动态扩展,只要继承了装饰器就可以动态扩展想要的功能了。

缺点:

  • 多层装饰是比较复杂的,提高了系统的复杂度。不利于我们调试~

猜你喜欢

转载自blog.csdn.net/s_pr1te/article/details/89004689
今日推荐