第12章 代理模式
12.1 我是游戲至尊
2007年,感覺很無聊,于是就玩了一段時間的網絡游戲,游戲名就不說了,反正就是打怪、升級、砍人、被人砍,然后繼續打怪、升級、打怪、升級……我花了兩個月的時間升到80級,已經很有成就感了,但是還會被人殺死,高手到處都是,GM(Game Master,游戲管理員)也不管,對于咱這種非RMB玩家基本上都是懶得搭理。在這段時間我是體會到網絡游戲的樂與苦,參與家族(工會)攻城,勝利后那叫一個樂呀,感覺自己真是一個“狂暴戰士”,無往不勝!那苦是什么呢?就是升級,為了升一級,就要到處殺怪,做任務,那個游戲還很變態,外掛管得很嚴,基本上出個外掛,沒兩天就開始封賬號,不敢用,升級基本上都要靠自己手打,累呀!我曾經的記錄是連著打了23個小時,睡覺在夢中還和大BOSS在PK。有這樣一段經歷還是很有意思的,作為架構師是不是可以把這段經歷通過架構的方式記錄下來呢?當然可以了,我們把這段打游戲的過程系統化,非常簡單的一個過程,如圖12-1所示。

圖12-1 游戲過程
太簡單了,定義一個接口IGamePlayer,是所有喜愛網絡游戲的玩家,然后定義一個具體的實現類GamePlayer,實現每個游戲愛好者為了玩游戲要執行的功能。代碼也非常簡單,我們先來看IGamePlayer,如代碼清單12-1所示。
代碼清單12-1 游戲者接口
public?interface?IGamePlayer?{
?????//登錄游戲
?????public?void?login(String?user,String?password);
?????//殺怪,網絡游戲的主要特色
?????public?void?killBoss();
?????//升級
?????public?void?upgrade();
}
非常簡單,定義了三個方法,分別是我們在網絡游戲中最常用的功能:登錄游戲、殺怪和升級,其實現類如代碼清單12-2所示。
代碼清單12-2 游戲者
public?class?GamePlayer?implements?IGamePlayer?{
?????private?String?name?=?"";
?????//通過構造函數傳遞名稱
?????public?GamePlayer(String?_name){
?????????????this.name?=?_name;
?????}
?????//打怪,最期望的就是殺老怪
?????public?void?killBoss()?{
?????????????System.out.println(this.name?+?"在打怪!");
?????}
?????//進游戲之前你肯定要登錄吧,這是一個必要條件
?????public?void?login(String?user,?String?password)?{
?????????????System.out.println("登錄名為"+user+"的用戶"+this.name+"登錄成功!");
?????}
?????//升級,升級有很多方法,花錢買是一種,做任務也是一種
?????public?void?upgrade()?{
?????????????System.out.println(this.name?+?"?又升了一級!");
?????}
}
在實現類中通過構造函數傳遞進來玩家姓名,方便進行后期的調試工作。我們通過一個場景類來模擬這樣的游戲過程,如代碼清單12-3所示。
代碼清單12-3 場景類
public?class?Client?{
?????public?static?void?main(String[]?args)?{
?????????????//定義一個癡迷的玩家
?????????????IGamePlayer?player?=?new?GamePlayer("張三");
?????????????//開始打游戲,記下時間戳
?????????????System.out.println("開始時間是:2009-8-25?10:45");
?????????????player.login("zhangSan",?"password");
?????????????//開始殺怪
?????????????player.killBoss();
?????????????//升級
?????????????player.upgrade();
?????????????//記錄結束游戲時間
?????????????System.out.println("結束時間是:2009-8-26?03:40");
?????}
}
程序記錄了游戲的開始時間和結束時間,同時也記錄了在游戲過程中都需要做什么事情,運行結果如下:
開始時間是:2009-8-25 10:45
登錄名為zhangSan 的用戶 張三登錄成功!
張三在打怪!
張三 又升了一級!
結束時間是:2009-8-26 03:40
運行結果也是我們想要的,記錄我這段時間的網游生涯。心理學家告訴我們,人類對于苦難的記憶比對喜悅的記憶要深刻,但是人類對于喜悅是“趨利”性的,每個人都想Happy,都不想讓苦難靠近,要想獲得幸福,苦難也是在所難免的,我們的網游生涯也是如此。游戲打時間長了,腰酸背痛、眼睛干澀、手臂酸麻,等等,也就是網絡成癮綜合癥都出來了。其結果就類似吃了那個“一日喪命散”,“筋脈逆流,胡思亂想,而致走火入魔”。那怎么辦呢?我們想玩游戲,但又不想碰觸到游戲中的煩惱,如何解決呢?有辦法,現在游戲代練的公司非常多,我把自己的賬號交給代練人員,由他們去幫我升級,去打怪,非常好的想法,我們來修改一下類圖,如圖12-2所示。

圖12-2 游戲代練幫忙打怪
在類圖中增加了一個GamePlayerProxy類來代表游戲代練者,它也不能有作弊的方法呀,游戲代練者也是手動打怪呀,因此同樣繼承IGamePlayer接口,其實現如代碼清單12-4所示。
代碼清單12-4 代練者
public?class?GamePlayerProxy?implements?IGamePlayer?{
?????private?IGamePlayer?gamePlayer?=?null;?????
?????//通過構造函數傳遞要對誰進行代練
?????public?GamePlayerProxy(IGamePlayer?_gamePlayer){
?????????????this.gamePlayer?=?_gamePlayer;
?????}
?????//代練殺怪
?????public?void?killBoss()?{
?????????????this.gamePlayer.killBoss();
?????}
?????//代練登錄
?????public?void?login(String?user,?String?password)?{
?????????????this.gamePlayer.login(user,?password);
?????}
?????//代練升級
?????public?void?upgrade()?{
?????????????this.gamePlayer.upgrade();
?????}
}
很簡單,首先通過構造函數說明要代誰打怪升級,然后通過手動開始代用戶打怪、升級。場景類Client代碼也稍作改動,如代碼清單12-5所示。
代碼清單12-5 改進后的場景類
public?class?Client?{
?????public?static?void?main(String[]?args)?{
?????????????//定義一個癡迷的玩家
?????????????IGamePlayer?player?=?new?GamePlayer("張三");
?????????????//然后再定義一個代練者
?????????????IGamePlayer?proxy?=?new?GamePlayerProxy(player);
?????????????//開始打游戲,記下時間戳
?????????????System.out.println("開始時間是:2009-8-25?10:45");
?????????????proxy.login("zhangSan",?"password");
?????????????//開始殺怪
?????????????proxy.killBoss();
?????????????//升級
?????????????proxy.upgrade();
?????????????//記錄結束游戲時間
?????????????System.out.println("結束時間是:2009-8-26?03:40");
?????}
}
運行結果也完全相同,還是張三這個用戶在打怪,運行結果如下:
開始時間是:2009-8-25 10:45
登錄名為zhangSan 的用戶 張三登錄成功!
張三在打怪!
張三 又升了一級!
結束時間是:2009-8-26 03:40
是的,沒有任何改變,但是你有沒有發覺,你的游戲已經在升級,有人在幫你干活了!終于升級到120級,基本上在本服務區,除了GM外,這個你可惹不起!這就是代理模式。
- 前言
- 第一部分 大旗不揮,誰敢沖鋒——6大設計原則全新解讀
- 第1章 單一職責原則
- 1.2 絕殺技,打破你的傳統思維
- 1.3 我單純,所以我快樂
- 1.4 最佳實踐
- 第2章 里氏替換原則
- 2.2 糾紛不斷,規則壓制
- 2.3 最佳實踐
- 第3章 依賴倒置原則
- 3.2 言而無信,你太需要契約
- 3.3 依賴的三種寫法
- 3.4 最佳實踐
- 第4章 接口隔離原則
- 4.2 美女何其多,觀點各不同
- 4.3 保證接口的純潔性
- 4.4 最佳實踐
- 第5章 迪米特法則
- 5.2 我的知識你知道得越少越好
- 5.3 最佳實踐
- 第6章 開閉原則
- 6.2 開閉原則的廬山真面目
- 6.3 為什么要采用開閉原則
- 6.4 如何使用開閉原則
- 6.5 最佳實踐
- 第二部分 真刀實槍 ——23種設計模式完美演繹
- 第7章 單例模式
- 7.2 單例模式的定義
- 7.3 單例模式的應用
- 7.4 單例模式的擴展
- 7.5 最佳實踐
- 第8章 工廠方法模式
- 8.2 工廠方法模式的定義
- 8.3 工廠方法模式的應用
- 8.4 工廠方法模式的擴展
- 8.5 最佳實踐
- 第9章 抽象工廠模式
- 9.2 抽象工廠模式的定義
- 9.3 抽象工廠模式的應用
- 9.4 最佳實踐
- 第10章 模板方法模式
- 10.2 模板方法模式的定義
- 10.3 模板方法模式的應用
- 10.4 模板方法模式的擴展
- 10.5 最佳實踐
- 第11章 建造者模式
- 11.2 建造者模式的定義
- 11.3 建造者模式的應用
- 11.4 建造者模式的擴展
- 11.5 最佳實踐
- 第12章 代理模式
- 12.2 代理模式的定義
- 12.3 代理模式的應用
- 12.4 代理模式的擴展
- 12.5 最佳實踐
- 第13章 原型模式
- 13.2 原型模式的定義
- 13.3 原型模式的應用
- 13.4 原型模式的注意事項
- 13.5 最佳實踐
- 第14章 中介者模式
- 14.2 中介者模式的定義
- 14.3 中介者模式的應用
- 14.4 中介者模式的實際應用
- 14.5 最佳實踐
- 第15章 命令模式
- 15.2 命令模式的定義
- 15.3 命令模式的應用
- 15.4 命令模式的擴展
- 15.5 最佳實踐
- 第16章 責任鏈模式
- 16.2 責任鏈模式的定義
- 16.3 責任鏈模式的應用
- 16.4 最佳實踐
- 第17章 裝飾模式
- 17.2 裝飾模式的定義
- 17.3 裝飾模式應用
- 17.4 最佳實踐
- 第18章 策略模式
- 18.2 策略模式的定義
- 18.3 策略模式的應用
- 18.4 策略模式的擴展
- 18.5 最佳實踐
- 第19章 適配器模式
- 19.2 適配器模式的定義
- 19.3 適配器模式的應用
- 19.4 適配器模式的擴展
- 19.5 最佳實踐
- 第20章 迭代器模式
- 20.2 迭代器模式的定義
- 20.3 迭代器模式的應用
- 20.4 最佳實踐
- 第21章 組合模式
- 21.2 組合模式的定義
- 21.3 組合模式的應用
- 21.4 組合模式的擴展
- 21.5 最佳實踐
- 第22章 觀察者模式
- 22.2 觀察者模式的定義
- 22.3 觀察者模式的應用
- 22.4 觀察者模式的擴展
- 22.5 最佳實踐
- 第23章 門面模式
- 23.2 門面模式的定義
- 23.3 門面模式的應用
- 23.4 門面模式的注意事項
- 23.5 最佳實踐
- 第24章 備忘錄模式
- 24.2 備忘錄模式的定義
- 24.3 備忘錄模式的應用
- 24.4 備忘錄模式的擴展
- 24.5 最佳實踐
- 第25章 訪問者模式
- 25.2 訪問者模式的定義
- 25.3 訪問者模式的應用
- 25.4 訪問者模式的擴展
- 25.5 最佳實踐
- 第26章 狀態模式
- 26.2 狀態模式的定義
- 26.3 狀態模式的應用
- 第27章 解釋器模式
- 27.2 解釋器模式的定義
- 27.3 解釋器模式的應用
- 27.4 最佳實踐
- 第28章 享元模式
- 28.2 享元模式的定義
- 28.3 享元模式的應用
- 28.4 享元模式的擴展
- 28.5 最佳實踐
- 第29章 橋梁模式
- 29.2 橋梁模式的定義
- 29.3 橋梁模式的應用
- 29.4 最佳實踐
- 第三部分 誰的地盤誰做主 ——設計模式PK
- 第30章 創建類模式大PK
- 30.1 工廠方法模式VS建造者模式
- 30.2 抽象工廠模式VS建造者模式
- 第31章 結構類模式大PK
- 31.1 代理模式VS裝飾模式
- 31.2 裝飾模式VS適配器模式
- 第32章 行為類模式大PK
- 32.1 命令模式VS策略模式
- 32.2 策略模式VS狀態模式
- 32.3 觀察者模式VS責任鏈模式
- 第33章 跨戰區PK
- 33.1 策略模式VS橋梁模式
- 33.2 門面模式VS中介者模式
- 33.3 包裝模式群PK
- 第四部分 完美世界 ——設計模式混編
- 第34章 命令模式+責任鏈模式
- 34.2 混編小結
- 第35章 工廠方法模式+策略模式
- 35.2 混編小結
- 第36章 觀察者模式+中介者模式
- 36.2 混編小結
- 第五部分 擴展篇
- 第37章 MVC框架
- 37.2 最佳實踐
- 第38章 新模式
- 38.1 規格模式
- 38.2 對象池模式
- 38.3 雇工模式
- 38.4 黑板模式
- 38.5 空對象模式
- 附錄 23種設計模式彩圖