1. 程式人生 > 其它 >設計模式-21種模式有哪些使用場景

設計模式-21種模式有哪些使用場景

  1、需要建立的物件應獨立於其型別與建立方式

  2、要例項化的類是在執行時決定的

  3、不想要與產品相對應的工廠層次

  4、不同類的例項間的差異僅是狀態的若干組合。因此複製相應數量的原型比手工例項化更加方便

  5、類不容易建立,比如每個元件可把其他元件作為子節點的組合物件。複製已有的組合物件並對副本進行修改會更加容易

  1、編譯時無法準確預測要建立物件的類

  2、類想讓其子類決定在執行時建立什麼

  3、類有若干輔助類作為其子類,而你想將返回哪個子類這一資訊區域性化

  (同工廠模式)

  1、需要建立涉及各種部件的複雜物件。建立物件的演算法應該獨立於部件的裝配方式。常見例子是構建組合物件

  2、構建過程需要以不同的方式(例如,部件或表現的不同組合)構建物件

  1、類只能有一個例項,而且必須從一個為人熟知的訪問點對其進行訪問,比如工廠方法

  2、這個唯一的例項只能通過子類化進行拓展,而且拓展的物件不會破壞客戶端程式碼

  1、 已有類的介面與需求不匹配。

  2、 想要一個可複用的類,該類能夠同時可能帶有不相容介面的其他類協作。

  3、需要適配一個類的幾個不同子類,可是讓每一個子類去子類化一個類介面卡又不現實。那麼可以是用物件介面卡(也叫委託)來適配其父類的介面。

  1、不想在抽象與其實現之間形成固定的繫結關係(這樣就能在執行時切換實現)

  2、抽象及其實現都應可以通過子類化獨立進行擴充套件

  3、對抽象的實現進行修改不應影響客戶端程式碼

  4、如果每個實現需要額外的子類以細化抽象,則說明有必要把他們分成兩個部分

  5、想在帶有不同抽象介面的多個物件之間共享一個實現

  1、子系統正逐漸變得複雜。應用模式的過程中演化成許多類。可以使用外觀為這些子系統提供一個較簡單的介面

  2、可以使用外觀對子系統進行分層。每個子系統級別有一個外觀作為入口點。讓它們通過其外觀進行通訊,可以簡化它們的依賴關係

  1、物件間的互動雖定義明確然而非常複雜,導致一組物件彼此相互依賴而且難以理解

  2、因為物件引用了許多其他物件並與其通訊,導致物件難以複用

  3、想要定製一個分佈在多個類中的邏輯或行為,又不想生成太多子類

  1、有兩種抽象型別相互依賴。將他們封裝在各自的物件中,就可以對他們單獨進行改變和複用。

  2、對一個物件的改變需要通知改變其他物件,而不知道具體有多少物件有待改變。

  3、一個物件必須通知其他物件,而他又不需要知道其他物件是什麼

  1、想獲得抽象物件的樹形表示(部分-整體的層次結構)

  2、想讓客戶端統一處理組合結構中的所有物件

  1、需要訪問組合物件的內容,而又不暴露其內部表示

  2、需要通過多種方式遍歷組合物件

  3、需要提供一個統一的介面,用來遍歷各種型別的組合物件

  1、一個複雜的物件結構包含很多其他物件,他們有不同的介面(比如組合體),但是想對這些物件實施一些依賴於其具體型別的操作。

  2、需要對一個組合體結構中的物件進行很多不相關的操作,但是不想讓這些操作“汙染”這些物件的類,可以將相關的操作集中起來,定義在一個訪問者類中,並在需要在訪問者中定義的操作時使用它。

  3、定義複雜結構的類很少作修改,但經常需要向其新增新的操作。

  1、想要在不影響其他物件情況下,以動態、透明的方式給單個物件新增職責。

  2、想要擴充套件一個類的行為,卻做不到。類定義可能被隱藏,無法進行子類化;或者,對類的每個行為的擴充套件,為支援每種功能組合,將產生大量的子類

  3、對類的職責的擴充套件是可選的

  1、有多個物件可以處理請求,而處理程式只有在執行時才能確定。

  2、向一組物件發出請求,而不想顯示指定處理請求的特定處理程式。

  1、需要一次性實現演算法的不變部分,並將可變的行為留給子類來實現。

  2、子類的共同行為應該被提取出來放到公共類中,以避免程式碼重複。現有程式碼的差別應該被分離為新的操作。然後用一個呼叫這些操作的模板方法來替換這些不同的程式碼。

  3、需要被控制子類的擴充套件。可以定義一個在特定點呼叫“鉤子”(hook)操作的模板方法。子類可以通過對鉤子操作的實現在這些點擴充套件功能。

  1、 一個類在其操作中使用多個條件語句來定義許多行為。我們可以把相關的分支條件移到他們自己的策略類中。

  2、需要演算法的各種變體。

  3、需要避免把複雜的、與演算法相關的資料結構暴露給客戶端。

  1、想讓應用程式支援撤銷與恢復

  2、想用物件引數化一個動作以執行操作,並用不同命令物件來代替回撥函式

  3、想要在不同時刻對請求進行指定、排列和執行

  4、想記錄修改日誌、這樣在系統故障時,這些修改可在後來重做一遍

  5、想讓系統支援事務,事務封裝了對資料的一系列修改。事務可以建模為命令物件

  1、應用程式使用很多物件。

  2、在記憶體中儲存物件會影響記憶體效能。

  3、物件的多數特有狀態(外在狀態)可以放到外部而輕量化。

  4、移除了外在狀態之後,可以用較少的共享物件替代原來的那組物件。

  5、應用程式不依賴於物件標識,因為共享物件不能提供唯一的標識。

  1、需要一個遠端代理,為位於不同地址空間或網路中的物件提供本地代表

  2、需要一個虛擬代理,來根據要求建立重型的物件

  3、需要一個保護代理,來根據不同訪問許可權控制對原物件的訪問

  4、需要一個智慧引用代理,通過對實體物件的引用計數來管理記憶體。也能用於鎖定實體物件,讓其他物件不能修改它

  1、需要儲存一個物件(或某部分)在某一個時刻的狀態,這樣以後就可以恢復到先前的狀態

  2、用於獲取狀態的介面會暴露實現的細節,需要將其隱藏起來