設計模式學習總結三
狀態模式:當一個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。(工作流中審批流程會用到 請假者申請請假 走oa流程)
案例二:
介面卡模式:將一個類的介面轉化為客戶希望的另外一個介面。Adapter模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
備忘錄模式:在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可以將該物件恢復到原先儲存的狀態。(一般去飯店點菜都會有一個選單這個就類似與備忘錄模式)
組合模式:將物件組合成樹型結構以表示“部分-整體”的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。(總公司-分公司)
分為 :透明方式和安全方式
透明方式:透明組合模式中,抽象構件Component中聲明瞭所有用於管理成員物件的方法,包括add()、remove()以及getChild()等方法,這樣做的好處是確保所有的構件類都有相同的介面。
安全方式:不透明的使用方式,即在客戶端不能全部針對抽象構件類程式設計,需要使用具體葉子構件型別來定義葉子物件。
安全組合模式的缺點是不夠透明,因為葉子構件和容器構件具有不同的方法,且容器構件中那些用於管理成員物件的方法沒有在抽象構件類中定義,因此客戶端不能完全針對抽象程式設計,必須有區別地對待葉子構件和容器構件
迭代器模式:提供一種方法順序訪問一個聚合物件中各個元素,而又不暴露該物件的內部表示。(現在已經封裝了迭代器例如foreach )
/// <summary>
/// 具體迭代器類
/// </summary>
public class ConcreteIterator:Iterator1
{
/// <summary>
/// 定義了一個具體聚集物件
/// </summary>
private ConcreteAggregate aggregate;
private int current = 0;
/// <summary>
/// 初始化時將具體的聚集物件傳入
/// </summary>
/// <param name="aggregate"></param>
public ConcreteIterator(ConcreteAggregate aggregate)
{
this.aggregate = aggregate;
}
/// <summary>
/// 得到聚集的第一個物件
/// </summary>
/// <returns></returns>
public override object First()
{
return aggregate[0];
}
/// <summary>
/// 得到聚集的下一個物件
/// </summary>
/// <returns></returns>
public override object Next()
{
object ret = null;
current++;
if (current < aggregate.Count)
{
ret = aggregate[current];
}
return ret;
}
/// <summary>
/// 判斷當前是否遍歷到結尾,到結尾返回true
/// </summary>
/// <returns></returns>
public override bool IsDone()
{
return current >= aggregate.Count ? true : false; ;
}
/// <summary>
/// 返回當前的聚集物件
/// </summary>
/// <returns></returns>
public override object CurrentItem()
{
return aggregate[current];
}
}
倒敘:
單例模式:保證一個類僅有一個例項,並提供一個訪問她的全域性訪問點。
餓漢模式:自己被載入時就被初始化
賴漢模式:第一次引用時才會將自己例項化
橋接模式:將物件部分與它的現實部分分離,使它們都可以獨立地變化。
、
命令模式:將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化,對請求排隊或者記錄請求日誌,以及支援可撤銷的操作。
案例二:
案例三:
職責鏈模式:使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞請求,直到有一個物件處理它為止。(加薪申請--申請流程和oa類似只是這裡是職責 不是狀態,屬於誰的職責範圍誰處理)