本文配套源碼比較設計模式常用程度適用層次引入時機結構復雜度Abstract Factory比較常用應用級設計時比較復雜Builder一般代碼級編碼時一般Fac
意圖實現通過統一的接口訪問不同類型元素的操作,並且通過這個接口可以增加新的操作而不改變元素的類。場景想不出什麼好例子,我們在組合模式的那個例子上進行修改吧。我
何時采用訪問者模式適用下面的情況:l 對象結構中包含很多類型,這些類型沒有統一的接口,而我們又希望使得對象的操作進行統一。l 希望為對象結構中的類型新增操作,
意圖用一個中介對象來封裝一系列對象的交互。中介者使得各對象不需要顯式相互引用,從而使其松散耦合,而且可以獨立地改變它們之間的交互。場景我們知道,一個網絡游戲往
現在,再來看看引入AccountSystem後的通訊:l 網站調用AccountSystem的注冊方法(1)l AccountSystem調用A、B和C大區的
代碼執行結果如下圖:代碼說明l AccountSystem是一個中介者角色,它負責各個同事類之間的交互。要使同事對象參與它的管理,就需要在內部維護一個同事對象
意圖定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時, 所有依賴於它的對象都得到通知並被自動更新。場景這次不說游戲了,假設我們需要在一個Web頁面
代碼執行結果如下圖: 代碼說明l 在這裡,我們使用C#語言事件機制來實現觀察者模式,雖然和GOF的“標准”模式不同,但是還是可以看出觀察者模式最基本的幾個角色
示例代碼using System;using System.Collections.Generic;using System.Text;namespace O
實現要點l 抽象主體角色公開了自身的事件,可以給任意觀察者訂閱。l 抽象觀察者角色定義了統一的處理行為,在C#中使用事件-代理模式的話,統一的處理行為並不這麼
碼執行結果如下圖: 代碼說明l 在代碼實例中,我們只考慮了防止請求過頻的控制,並且也沒有考慮客戶端和服務端通訊的行為,在實際操作中並不會這麼做。l Man類是
示例代碼using System;using System.Collections.Generic;using System.Text;namespace C
代碼執行結果如下圖(後面一圖為注釋掉InitGM()方法中初始化managerTeam代碼的執行結果):代碼說明l Case類代表了問題。CaseCatego
何時采用l 從代碼角度來說,如果一個邏輯的處理由不同責任對象完成,客戶端希望能自定義這個處理流程並且不希望直接和多個責任對象發生耦合的時候可以考慮責任鏈模式。
意圖允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。場景我們在制作一個網上書店的網站,用戶在書店買了一定金額的書後可以升級為銀會員、黃
代碼執行結果如下圖:代碼說明l User類型是環境角色。它的作用一是定義了客戶端感興趣的方法(購買書籍),二是擁有一個狀態實例,它定義了用戶的當前狀態(普通會
代碼執行結果如下圖:代碼說明l Data類就是環境或者說上下文角色,持有對策略角色的引用。在這裡,我們通過一個方法來設置環境使用的策略,你也可以根據需求在構造
代碼執行結果如下圖:代碼說明l PayGateway類型是抽象模版角色。它定義了支付過程不變的部分,並且把變化部分定義為抽象操作,讓子類去實現。其中的Subm