編輯:關於android開發
裝飾者模式主要體現了OO原則中的“對擴展開放,對修改關閉”這條原則。
裝飾者模式主要有一下特點:
1 裝飾者和被裝飾對象有相同的超類型;
2 你可以用一個或多個裝飾者包裝一個對象;
3既然裝飾者和被裝飾對象有相同的超類型,所以在任何需要原始對象(被包裝的)的場合,可以使用裝飾過的對象代替它;
4裝飾者可以在所委托被裝飾者的行為之前與/或之後,加上自己的行為,以達到特定的目的;
5對象可以在任何時候被裝飾,所以可以在運行時動態地,不限量地用你喜歡的裝飾者來修飾對象。
裝飾者模式的定義:
動態地將責任附加到對象上。若要擴展功能,裝飾者提供比繼承更具有彈性的代替方案。
使用場景舉例:星巴克咖啡的訂單系統,一種咖啡(比如,綜合、深焙、低咖啡因、濃縮)可以加入多種調料(牛奶、摩卡、豆漿、奶泡),比如顧客想要一杯雙倍摩卡豆漿奶泡咖啡,或者牛奶摩卡濃縮咖啡,在這個場景中,基礎的咖啡屬於被裝飾者,而各種調料屬於裝飾者。
根據裝飾者的特性(裝飾者和被裝飾對象有相同的超類型)所以首先定義一個抽象的Beverage類,這是飲料和調料的基類,飲料和調料都會繼承這個抽象類。
public abstract class Beverage { String description = "Unknown Beverage"; public String getDescription() { return description; } public abstract double cost(); }
基類中有一個飲料描述的屬性,和一個計算價格的抽象方法,同時還有一個獲取描述的getDescription方法
在聲明一個所有調料的抽象類,也就是裝飾者類,注意這裡是調料!
public abstract class CondimentDecorator extends Beverage { public abstract String getDescription(); }
CondimentDecorator 繼承自Beverage 從而滿足裝飾者和被裝飾對象有相同的超類型。
現在具體來實現一種飲料吧,以濃縮咖啡為例
public class Espresso extends Beverage {//繼承自Beverage因為Espresso是一種飲料 public Espresso() { // TODO Auto-generated constructor stub description = "Espresso";//設置飲料的描述,這裡使用了構造器,或者你也可以使用setter方法。 } @Override public double cost() { // TODO Auto-generated method stub return 1.99;//返回Espresso的價格 } }
現在是各種調料的具體實現
摩卡的
public class Mocha extends CondimentDecorator {//繼承自CondimentDecorator保證相同的超類型。 Beverage beverage;//記錄飲料。 public Mocha(Beverage beverage) { // TODO Auto-generated constructor stub this.beverage = beverage; } @Override public String getDescription() { // TODO Auto-generated method stub return beverage.getDescription() + ",Mocha";//完整的飲料描述。 } @Override public double cost() { // TODO Auto-generated method stub return .20 + beverage.cost();//返回帶摩卡的咖啡飲料價錢 } }
豆漿的
public class Soy extends CondimentDecorator { Beverage beverage; public Soy(Beverage beverage) { // TODO Auto-generated constructor stub this.beverage = beverage; } @Override public String getDescription() { // TODO Auto-generated method stub return beverage.getDescription() + ",soy"; } @Override public double cost() { // TODO Auto-generated method stub return .15 + beverage.cost(); } }
奶泡的
package com.design.patterns.decorator; public class Whip extends CondimentDecorator { Beverage beverage; public Whip(Beverage beverage) { // TODO Auto-generated constructor stub this.beverage = beverage; } @Override public String getDescription() { // TODO Auto-generated method stub return beverage.getDescription() + ",whip"; } @Override public double cost() { // TODO Auto-generated method stub return .10 + beverage.cost(); } }
測試一下,比如現在顧客想要一杯甚麼都不加的濃縮咖啡,代碼如下:
public class StarbuzzCoffee { public static void main(String[] args) { // TODO Auto-generated method stub Beverage beverage=new Espresso();//訂一杯Espresso,不需要調料。 System.out.println(beverage.getDescription()+" $"+beverage.cost());//打印描述與價格 } }
打印結果
Espresso $1.99
再來一杯摩卡奶泡的濃縮咖啡
public class StarbuzzCoffee { public static void main(String[] args) { // TODO Auto-generated method stub Beverage beverage=new Espresso();//濃縮咖啡 beverage=new Mocha(beverage);//用摩卡裝飾它 beverage=new Whip(beverage);//用奶泡裝飾它 System.out.println(beverage.getDescription()+" $"+beverage.cost());//打印描述和價格 } }
打印結果
Espresso,Mocha,whip $2.29
由以上例子可以看出裝飾者模式巧妙的運用了組合和委托的方式,達到在運行時動態的加上新行為;你可以用無數個裝飾者包裝一個對象;裝飾者的缺點同時也是顯而易見的,那就是使用裝飾者模式會導致設計中出現許多小對象,如果過度使用,會讓程序變得很復雜,所以在實際使用過程中可以使用裝飾者模式+工廠模式的組合形式。
RecycleView 滑動到底部,加載更多,recycleview滑動 android.support.v7 包提供了一個新的組件:RecycleView,用以提供一
android自定義控件實現刮刮樂效果,android刮刮樂 只是簡單的實現了效果,界面沒怎麼做優化,不過那都是次要的啦!! 其中主要的彩票視圖類和橡皮擦類都是通過代碼
Android 獲取系統的聯系人,android獲取聯系人本文主要介紹android中怎樣獲取系統的聯系人數據 首先打開模擬器 點擊聯系人圖標按鈕 說明系統聯系人數據
2015烏鎮互聯網大會,母嬰美食快餐類APP入眼,2015烏鎮重構與用戶之間的信任感將是這一細分行業的首要任務。未來誰能真正贏得用戶的信任,誰才能笑到最後。 這幾日,整