# 多人聯機射擊游戲中的設計模式應用(一)
為了方便大家更加系統地學習和掌握各種常用的設計模式,下面通過一個綜合實例——“多人聯機射擊游戲”來學習如何在實際開發中綜合使用設計模式。
反恐精英(Counter-Strike, CS)、三角洲部隊、戰地等多人聯機射擊游戲廣受玩家歡迎,在多人聯機射擊游戲的設計中,可以使用多種設計模式。下面我選取一些較為常用的設計模式進行分析:
(1) 抽象工廠模式
在聯機射擊游戲中提供了多種游戲場景,不同的游戲場景提供了不同的地圖、不同的背景音樂、不同的天氣等,因此可以使用抽象工廠模式進行設計,類圖如圖1所示:

圖1 抽象工廠模式實例類圖
在圖1中,SceneFactory充當抽象工廠,其子類SceneAFactory等充當具體工廠,可以創建具體的地圖(Map)、背景音樂(Music)和天氣(Weather)等產品對象,如果需要增加新場景,只需增加新的具體場景工廠類即可。
(2) 建造者模式
在聯機射擊游戲中每一個游戲人物角色都需要提供一個完整的角色造型,包括人物造型、服裝、武器等,可以使用建造者模式來創建一個完整的游戲角色,類圖如圖2所示:

圖2 建造者模式實例類圖
在圖2中,PlayerCreatorDirector充當指揮者角色,PlayerBuilder是抽象建造者,其子類PlayerBuilderA和PlayerBuilderB是具體建造者,用于創建不同的游戲角色,Player是所創建的完整產品,即完整的游戲角色,它包含形體(body)、服裝(costume)和武器(weapon)等組成部分。
(3) 工廠方法模式
在射擊游戲中,AK47沖鋒步槍、狙擊槍、手槍等不同武器(Weapon)的外觀、使用方法和殺傷力都不相同,玩家可以使用不同的武器,而且游戲升級時還可以增加新的武器,無需對現有系統做太多修改,可使用工廠方法模式來設計武器系統,類圖如圖3所示:

圖3 工廠方法模式實例類圖
在圖3中,WeaponFactory接口表示抽象武器工廠,其子類AK47GunFactory生產AK47Gun,SniperRifleFactory生產SniperRifle,不同的武器的display()、use()和fire()等方法有不同的實現。
(4) 迭代器模式
在射擊游戲中,一個玩家可以擁有多種武器,如既可以擁有AK47沖鋒槍,還可以擁有手槍和匕首,因此系統需要定義一個彈藥庫(武器的集合),在游戲過程中可以遍歷彈藥庫(Magazine),選取合適的武器,在遍歷彈藥庫時可使用迭代器模式,如類圖如圖4所示:

圖4 迭代器模式實例類圖
在類Magazine中,可以通過迭代器遍歷彈藥庫,Magazine類的代碼片段如下所示:
```
public class Magazine {
private ArrayList weapons;
private Iterator iterator;
public Magazine() {
weapons = new ArrayList();
iterator = weapons.iterator();
}
public void display() {
while(iterator.hasNext()) {
((Weapon)iterator.next()).display();
}
}
......
}
```
除了遍歷彈藥庫外,迭代器模式還可以用于遍歷戰隊盟友等聚合對象。
(5) 命令模式
在射擊游戲中,用戶可以自定義快捷鍵,根據使用習慣來設置快捷鍵,如“W”鍵可以設置為“開槍”的快捷鍵,也可以設置為“前進”的快捷鍵,可通過命令模式來實現快捷鍵設置,類圖如圖5所示:

圖5 命令模式實例類圖
在圖5中,ShortcutKey充當請求調用者,在其press()方法中將判斷用戶按的是哪個按鍵,再調用命令對象的execute()方法,在具體命令對象的execute()方法中將調用接收者如ShotHandler、GoAheadHandler的action()方法來執行具體操作。在實現時可以將具體命令類類名和鍵盤按鍵的鍵碼(Keycode)存儲在配置文件中,配置文件格式如下所示:
```
……
<FunctionMapping keycode="87" commandClass="ShotCommand"/>
<FunctionMapping keycode="38" commandClass="GoAheadCommand"/>
……
```
如果需要更換快捷鍵,只需修改鍵碼和具體命令類的映射關系即可;如果需要在游戲的升級版本中增加一個新功能,只需增加一個新的具體命令類,可通過修改配置文件來為其設置對應的按鍵,原有類庫代碼無需任何修改,很好地符合開閉原則。
- Introduction
- 基礎知識
- 設計模式概述
- 從招式與內功談起——設計模式概述(一)
- 從招式與內功談起——設計模式概述(二)
- 從招式與內功談起——設計模式概述(三)
- 面向對象設計原則
- 面向對象設計原則之單一職責原則
- 面向對象設計原則之開閉原則
- 面向對象設計原則之里氏代換原則
- 面向對象設計原則之依賴倒轉原則
- 面向對象設計原則之接口隔離原則
- 面向對象設計原則之合成復用原則
- 面向對象設計原則之迪米特法則
- 六個創建型模式
- 簡單工廠模式-Simple Factory Pattern
- 工廠三兄弟之簡單工廠模式(一)
- 工廠三兄弟之簡單工廠模式(二)
- 工廠三兄弟之簡單工廠模式(三)
- 工廠三兄弟之簡單工廠模式(四)
- 工廠方法模式-Factory Method Pattern
- 工廠三兄弟之工廠方法模式(一)
- 工廠三兄弟之工廠方法模式(二)
- 工廠三兄弟之工廠方法模式(三)
- 工廠三兄弟之工廠方法模式(四)
- 抽象工廠模式-Abstract Factory Pattern
- 工廠三兄弟之抽象工廠模式(一)
- 工廠三兄弟之抽象工廠模式(二)
- 工廠三兄弟之抽象工廠模式(三)
- 工廠三兄弟之抽象工廠模式(四)
- 工廠三兄弟之抽象工廠模式(五)
- 單例模式-Singleton Pattern
- 確保對象的唯一性——單例模式 (一)
- 確保對象的唯一性——單例模式 (二)
- 確保對象的唯一性——單例模式 (三)
- 確保對象的唯一性——單例模式 (四)
- 確保對象的唯一性——單例模式 (五)
- 原型模式-Prototype Pattern
- 對象的克隆——原型模式(一)
- 對象的克隆——原型模式(二)
- 對象的克隆——原型模式(三)
- 對象的克隆——原型模式(四)
- 建造者模式-Builder Pattern
- 復雜對象的組裝與創建——建造者模式(一)
- 復雜對象的組裝與創建——建造者模式(二)
- 復雜對象的組裝與創建——建造者模式(三)
- 七個結構型模式
- 適配器模式-Adapter Pattern
- 不兼容結構的協調——適配器模式(一)
- 不兼容結構的協調——適配器模式(二)
- 不兼容結構的協調——適配器模式(三)
- 不兼容結構的協調——適配器模式(四)
- 橋接模式-Bridge Pattern
- 處理多維度變化——橋接模式(一)
- 處理多維度變化——橋接模式(二)
- 處理多維度變化——橋接模式(三)
- 處理多維度變化——橋接模式(四)
- 組合模式-Composite Pattern
- 樹形結構的處理——組合模式(一)
- 樹形結構的處理——組合模式(二)
- 樹形結構的處理——組合模式(三)
- 樹形結構的處理——組合模式(四)
- 樹形結構的處理——組合模式(五)
- 裝飾模式-Decorator Pattern
- 擴展系統功能——裝飾模式(一)
- 擴展系統功能——裝飾模式(二)
- 擴展系統功能——裝飾模式(三)
- 擴展系統功能——裝飾模式(四)
- 外觀模式-Facade Pattern
- 深入淺出外觀模式(一)
- 深入淺出外觀模式(二)
- 深入淺出外觀模式(三)
- 享元模式-Flyweight Pattern
- 實現對象的復用——享元模式(一)
- 實現對象的復用——享元模式(二)
- 實現對象的復用——享元模式(三)
- 實現對象的復用——享元模式(四)
- 實現對象的復用——享元模式(五)
- 代理模式-Proxy Pattern
- 設計模式之代理模式(一)
- 設計模式之代理模式(二)
- 設計模式之代理模式(三)
- 設計模式之代理模式(四)
- 十一個行為型模式
- 職責鏈模式-Chain of Responsibility Pattern
- 請求的鏈式處理——職責鏈模式(一)
- 請求的鏈式處理——職責鏈模式(二)
- 請求的鏈式處理——職責鏈模式(三)
- 請求的鏈式處理——職責鏈模式(四)
- 命令模式-Command Pattern
- 請求發送者與接收者解耦——命令模式(一)
- 請求發送者與接收者解耦——命令模式(二)
- 請求發送者與接收者解耦——命令模式(三)
- 請求發送者與接收者解耦——命令模式(四)
- 請求發送者與接收者解耦——命令模式(五)
- 請求發送者與接收者解耦——命令模式(六)
- 解釋器模式-Interpreter Pattern
- 自定義語言的實現——解釋器模式(一)
- 自定義語言的實現——解釋器模式(二)
- 自定義語言的實現——解釋器模式(三)
- 自定義語言的實現——解釋器模式(四)
- 自定義語言的實現——解釋器模式(五)
- 自定義語言的實現——解釋器模式(六)
- 迭代器模式-Iterator Pattern
- 遍歷聚合對象中的元素——迭代器模式(一)
- 遍歷聚合對象中的元素——迭代器模式(二)
- 遍歷聚合對象中的元素——迭代器模式(三)
- 遍歷聚合對象中的元素——迭代器模式(四)
- 遍歷聚合對象中的元素——迭代器模式(五)
- 遍歷聚合對象中的元素——迭代器模式(六)
- 中介者模式-Mediator Pattern
- 協調多個對象之間的交互——中介者模式(一)
- 協調多個對象之間的交互——中介者模式(二)
- 協調多個對象之間的交互——中介者模式(三)
- 協調多個對象之間的交互——中介者模式(四)
- 協調多個對象之間的交互——中介者模式(五)
- 備忘錄模式-Memento Pattern
- 撤銷功能的實現——備忘錄模式(一)
- 撤銷功能的實現——備忘錄模式(二)
- 撤銷功能的實現——備忘錄模式(三)
- 撤銷功能的實現——備忘錄模式(四)
- 撤銷功能的實現——備忘錄模式(五)
- 觀察者模式-Observer Pattern
- 對象間的聯動——觀察者模式(一)
- 對象間的聯動——觀察者模式(二)
- 對象間的聯動——觀察者模式(三)
- 對象間的聯動——觀察者模式(四)
- 對象間的聯動——觀察者模式(五)
- 對象間的聯動——觀察者模式(六)
- 狀態模式-State Pattern
- 處理對象的多種狀態及其相互轉換——狀態模式(一)
- 處理對象的多種狀態及其相互轉換——狀態模式(二)
- 處理對象的多種狀態及其相互轉換——狀態模式(三)
- 處理對象的多種狀態及其相互轉換——狀態模式(四)
- 處理對象的多種狀態及其相互轉換——狀態模式(五)
- 處理對象的多種狀態及其相互轉換——狀態模式(六)
- 策略模式-Strategy Pattern
- 算法的封裝與切換——策略模式(一)
- 算法的封裝與切換——策略模式(二)
- 算法的封裝與切換——策略模式(三)
- 算法的封裝與切換——策略模式(四)
- 模板方法模式-Template Method Pattern
- 模板方法模式深度解析(一)
- 模板方法模式深度解析(二)
- 模板方法模式深度解析(三)
- 訪問者模式-Visitor Pattern
- 操作復雜對象結構——訪問者模式(一)
- 操作復雜對象結構——訪問者模式(二)
- 操作復雜對象結構——訪問者模式(三)
- 操作復雜對象結構——訪問者模式(四)
- 設計模式趣味學習(復習)
- 設計模式與足球(一)
- 設計模式與足球(二)
- 設計模式與足球(三)
- 設計模式與足球(四)
- 設計模式綜合應用實例
- 多人聯機射擊游戲
- 多人聯機射擊游戲中的設計模式應用(一)
- 多人聯機射擊游戲中的設計模式應用(二)
- 數據庫同步系統
- 設計模式綜合實例分析之數據庫同步系統(一)
- 設計模式綜合實例分析之數據庫同步系統(二)
- 設計模式綜合實例分析之數據庫同步系統(三)