---------------------------------根據《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------------------------------