設計模式-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、用於獲取狀態的介面會暴露實現的細節,需要將其隱藏起來