「將多變的行為分離出來封裝成狀態,通過狀態切換來改變呈現的行為。」
context(狀態擁有者,可以是任何有多種狀態的類)、istate(狀態介面)、state(狀態類)
context擁有istate狀態介面物件m_state,指示當前狀態。呼叫context相關方法時呼叫m_state對應的方法呈現出不同行為,同時提供setstate方法修改當前狀態。state要實現istate中會被context呼叫的方法。狀態切換的時機和條件可以由context控制,但推薦的是讓state擁有context的引用,由state控制狀態切換。
狀態的切換有兩種方式:
1、context來控制,親自維護各項判斷條件
2、context設定初始狀態,之後由state負責(這樣可以縮減context的職責,而且state本身比較明白該切換到哪個state。不過這樣需要把context的引用傳給state。)
public class context;
//切換狀態
public void setstate(istate state)}
public abstract class istate
//用於呈現行為,由擁有者的requestx呼叫
public abstract void handlex(){}
}
單一職責:將state轉換的職責分離出context,context只負責擁有和修改當前state
開閉:不用修改context,增加新的state,即可擴充套件context的呈現行為
依賴倒置:context依賴istate介面,不必在意有哪些state具體類
1、降低維護難度,方便增加行為。代替了switch語句來切換狀態,更優雅,減少可能的錯誤。乙個狀態相關的行為被封裝在乙個類中,清晰易維護。
2、外界對context的使用方式不變,但呈現的行為卻改變了。
3、狀態類復用。例如遊戲場景和其對應的場景狀態類可以復用到不同專案中。(想想各個大廠的遊戲登陸場景)
雖然比傳統的switch實現方式更易維護,但過多的狀態類也麻煩。
「將多個介面封裝在乙個統一簡單介面中,使內部介面之間的互動對外隱藏」
成員:facade(統一外觀介面),subsystemx(各個被統一的介面)
public class facade
}
迪公尺特:將原本對多個子系統subsystem的操作封裝成對乙個介面facade的操作,減少了互動物件
開閉:當子系統之間的合作完成的功能需要修改,只會影響統一介面facade。
單一職責:子系統的合作由facade負責。
1、節省時間,簡潔。原本修改乙個subsystem需要修改引用它的多個類,現在只需修改facade。
2、減少耦合,易於分工。
3、增加安全性。確保子系統按順序協同工作。
facade有太多子系統會過於龐大而難以維護。
使用單例的facade。subsystem之間的協同使用中介者模式,彌補互相之間溝通過於複雜的問題。
「使類在全域性只有乙個物件,並通過乙個全域性的方法訪問」
singleton(單例類)
將構造方法設為private,對外提供獲取類的靜態單例instance的方法,在該方法中唯一地產生單例。
public class singleton
public static singletone getinstance()}}
}}
方便,省略建立物件,傳參,物件和資料維持獨乙份,快速獲取。
違反開閉:單例物件是實現類而不是抽象類。
單例類無法被繼承來實現多型,因為建構函式在內部呼叫,已經確定了例項化的物件。
「將多個物件之間的互相的引用改為多個物件對乙個中介者的引用,由中介代替它們互動」
imediator(中介者介面)、mediator(中介者)、icolleague(同事介面)、colleague(同事實現類)
colleague擁有imediator的物件,並通過action呼叫mediator的sendmessage傳送訊息。mediator擁有多個colleague,sendmessage執行時呼叫所有colleague的request處理訊息。
public abstract class icolleague
//用於被mediator呼叫,傳入訊息,並執行相關操作
public abstarct void request(string message);}
public abstract class imediator
迪公尺特:將多個colleague之間的互相耦合改為對乙個mediator的耦合。
1、減少了多個物件之間的互相引用,方便維護。所有物件只用引用中介者這乙個物件,它們的修改只會影響到中介者。
mediator維護的colleague過多。
如果是多個物件與乙個物件之間的互動的話,可以使用觀察者模式。也就是說中介者模式適用於多個物件之間的互動。
參考:《設計模式與遊戲完美開發》
《headfirst設計模式》
設計模式總結 一
單一職責原則 開放 封閉原則 依賴倒轉原則 class tshirts finery class bigtrouser finery class sneakers finery class suit finery class tie finery class leathershoes finery ...
設計模式總結 (一)
1 工廠模式屬於建立型模式,大致可以分為三類,簡單工廠模式 工廠方法模式 抽象工廠模式。簡單工廠模式,它的主要特點是需要在工廠類中通過標籤做判斷,返回例項 工廠方法模式,是指定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。factory method使乙個類的例項化延遲到其子類。抽象工廠模式,...
設計模式相關
zuoxiaolong8810 左瀟龍 設計模式學習記錄 程式設計六大原則 單一職責原則 描述的意思是每個類都只負責單一的功能,切不可太多,並且乙個類應當盡量的把乙個功能做到極致。黎克特制替換原則 這個原則表達的意思是乙個子類應該可以替換掉父類並且可以正常工作。介面隔離原則 也稱介面最小化原則,強調...