設計模式---裝飾者模式

---------------------------------根據《Head First 設計模式》整理記憶----------------------------------

解決問題:從一個星巴茲咖啡店開始,有飲料和調料構成,飲料可以添加多種調料,調料有蒸奶,摩卡,豆漿等。

設計原則:類應該對擴展開放,對修改關閉。



裝飾者模式:動態地將責任附加到對象上,若要擴展對象,裝飾者模式提供了比繼承更彈性的替代方案

 要點: 裝飾者與被裝飾者擁有共同的超類,繼承的目的是繼承類型,而不是行爲

裝飾者包含一個超類的對象,這樣,可以在被裝飾者行爲前或者行爲後加上新的行爲,甚至取代原有的行爲

裝飾者會使程序中出現很多小類,增加使用難度

1.超類:

package DecoratorPattern;

/**
 * @author 作者 E-mail:
 * @version 創建時間:2015年7月10日 下午3:12:15 類說明
 */
public abstract class Beverage {
	String description = "Unknow Beverage";

	public String getDescription() {
		return description;
	}

	public abstract double cost();
}

2.裝飾者總類:

package DecoratorPattern;
/** 
 * @author 作者 E-mail: 
 * @version 創建時間:2015年7月10日 下午3:14:43 
 * 類說明 
 */
public abstract class CondimentDecorator extends Beverage {
	public abstract String getDescription();
}

3.四種被裝飾者類:

package DecoratorPattern;

/**
 * @author 作者 E-mail:
 * @version 創建時間:2015年7月10日 下午3:16:07 類說明
 */
public class DarkRoast extends Beverage {
	public DarkRoast() {
		description = "DarkRoast";
	}

	public double cost() {
		return 3.99;
	};
}

package DecoratorPattern;

/**
 * @author 作者 E-mail:
 * @version 創建時間:2015年7月10日 下午3:16:07 類說明
 */
public class Decat extends Beverage {
	public Decat() {
		description = "Decat";
	}

	public double cost() {
		return 4.99;
	};
}

package DecoratorPattern;

/**
 * @author 作者 E-mail:
 * @version 創建時間:2015年7月10日 下午3:16:07 類說明
 */
public class Espresso extends Beverage {
	public Espresso() {
		description = "Espresso";
	}

	public double cost() {
		return 1.99;
	};
}

package DecoratorPattern;

/**
 * @author 作者 E-mail:
 * @version 創建時間:2015年7月10日 下午3:16:07 類說明
 */
public class HouseBlend extends Beverage {
	public HouseBlend() {
		description = "HouseBlend";
	}

	public double cost() {
		return 2.99;
	};
}

4.三種裝飾者類:

package DecoratorPattern;

/**
 * @author 作者 E-mail:
 * @version 創建時間:2015年7月10日 下午3:19:36 類說明
 */
public class Mocha extends CondimentDecorator {
	Beverage beverage;

	public Mocha(Beverage beverage) {
		this.beverage = beverage;
	};

	public String getDescription() {
		return beverage.getDescription() + ", Mocha";
	};

	public double cost() {
		return .10 + beverage.cost();
	}
}

package DecoratorPattern;

/**
 * @author 作者 E-mail:
 * @version 創建時間:2015年7月10日 下午3:19:36 類說明
 */
public class Soy extends CondimentDecorator {
	Beverage beverage;

	public Soy(Beverage beverage) {
		this.beverage = beverage;
	};

	public String getDescription() {
		return beverage.getDescription() + ", Soy";
	};

	public double cost() {
		return .20 + beverage.cost();
	}
}

package DecoratorPattern;

/**
 * @author 作者 E-mail:
 * @version 創建時間:2015年7月10日 下午3:19:36 類說明
 */
public class Whip extends CondimentDecorator {
	Beverage beverage;

	public Whip(Beverage beverage) {
		this.beverage = beverage;
	};

	public String getDescription() {
		return beverage.getDescription() + ", Whip";
	};

	public double cost() {
		return .20 + beverage.cost();
	}
}

5.窗口測試類:

package DecoratorPattern;

/**
 * @author 作者 E-mail:
 * @version 創建時間:2015年7月10日 下午3:23:40 類說明
 */
public class TestMain {

	public static void main(String[] args) {
		Beverage beverage = new Espresso();
		System.out.println(beverage.getDescription() + " $" + beverage.cost());

		Beverage beverage1 = new DarkRoast();
		beverage1 = new Mocha(beverage1);
		beverage1 = new Mocha(beverage1);
		beverage1 = new Whip(beverage1);
		System.out
				.println(beverage1.getDescription() + " $" + beverage1.cost());

		Beverage beverage2 = new DarkRoast();
		beverage2 = new Soy(beverage2);
		beverage2 = new Mocha(beverage2);
		beverage2 = new Whip(beverage2);
		System.out
				.println(beverage2.getDescription() + " $" + beverage2.cost());
	}

}


---------附全部源代碼:http://download.csdn.net/detail/bingbing8219/8887627------------------------------


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章