头第一本书的装饰图案

时间:2015-12-04 05:38:50

标签: design-patterns

我正在编写Head First Design Patterns一书。 问题: 在starbuzz应用程序上使用Decorator模式为现有代码添加大小

Beverage.Class



package CoffeHouse.drinks;

import CoffeHouse.drinks.sizedBevrage.Size;

/**
 * trying to implement decorator pattern and understand why and how it is implemented
 * @author praveen
 *
 */
public abstract class Bevrage {
	
	Size drinkSize = null;
	
	String description = "Unknown Drink";
	
	public String getDescription(){
		return description;
	}
	
	public Size getSize(){
		return drinkSize;
	}
	
	public abstract double cost();
	
}




Expresso Class



public class Expresso extends Bevrage {
	
	public Expresso(){
		this.description = "Expresso";
	}
	
	@Override
	public double cost() {
		// TODO Auto-generated method stub
		return 1.19;
	}

}




调味品类



package CoffeHouse.condiments;

import CoffeHouse.drinks.Bevrage;

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




摩卡课



package CoffeHouse.condiments;

import CoffeHouse.drinks.Bevrage;

public class Mocha extends CondimentDecorator{
	
	private Bevrage bevrage;
	
	public Mocha(Bevrage be){
		this.bevrage  = be;
	}
	@Override
	public String getDescription() {
		// TODO Auto-generated method stub
		return this.bevrage.getDescription()+",Mocha";
	}

	@Override
	public double cost() {
		// TODO Auto-generated method stub
		return this.bevrage.cost()+0.15;
	}

}




我们被要求编辑此代码,以便添加饮料的大小,并根据大小确定调味品的成本。我遇到的问题是,如果我将尺寸方法添加到饮料抽象类中,则mocha类也会继承它。我不想给摩卡课程改变饮料大小的能力。这是装饰模式的限制还是有解决方法

1 个答案:

答案 0 :(得分:1)

你有4类咖啡:

  • Houseblend
  • 在DarkRoast
  • 咖啡
  • 无咖啡因

你还有4种调味品,你可以添加到咖啡中:

  • 摩卡
  • 大豆

您实施的唯一方法是getSize(),因此您没有设定饮品的大小。

相反,4种调味品中的每一种都可以达到饮料的大小,因此它知道"你需要在饮料中添加多少调味品。一个小的DarkRoast确实需要一点点牛奶,比如0.10 $,而通风大小的DarkRoast则需要更多牛奶,然后需要花费0.20美元。

所以确实Mocha(以及所有其他调味品类)需要 getSize() - 方法才能知道饮料的大小。根据这些知识,他们可以定义添加到饮料中的调味品数量的成本。 (参见第3章最后一页的解决方案[Head First Patterns 2014年第二版])

调味品无法设定/更改饮料的大小。因此,有意的是,Mocha继承了getSize() - 方法,无需解决方法。