“
閱讀本文大概需要 10 分鐘。
”
冠軍之刃-銳雯 【網絡配圖】
設計模式(Design Pattern)是一套被反覆使用、多數人知曉的、經過分類的、代碼設計經驗的總結。使用設計模式的目的:爲了代碼可重用性、讓代碼更容易被他人理解、保證代碼可靠性。設計模式使代碼編寫真正工程化;設計模式是軟件工程的基石脈絡,如同大廈的結構一樣。
通常被有經驗的面向對象的軟件開發人員所採用。設計模式是軟件開發人員在軟件開發過程中面臨的一般問題的解決方案。這些解決方案是衆多軟件開發人員經過相當長的一段時間的試驗和錯誤總結出來的。
設計模式有很多中,但可以把它們歸爲三類:
- 創建型設計模式
- 結構型設計模式
- 行爲型設計模式
而 “門面模式” (也稱外觀模式)也是衆多設計模式的一種,它屬於結構型設計模式。
什麼是門面模式(Facade)?
爲子系統中的一組接口提供一個一致的界面
Facade 模式定義了一個高層接口,這個接口使得這子系統更加容易使用。
什麼時候需要使用門面模式?
在以下情況下可以考慮使用外觀模式:
(1)設計初期階段,應該有意識的將不同層分離,層與層之間建立外觀模式。
(2) 開發階段,子系統越來越複雜,增加外觀模式提供一個簡單的調用接口。
(3) 維護一個大型遺留系統
門面模式解決了什麼問題?
(1)實現了子系統與客戶端之間的鬆耦合關係。
(2)客戶端屏蔽了子系統組件,減少了客戶端所需處理的對象數目,並使得子系統使用起來更加容易。
這不是 S8 剛過,蹭一波 IG牛批 的熱度,我們通過英雄聯盟的角色 -- 銳雯,來理解門面模式。我是一名爬蟲工程師,常用 Python ,所以接下來的代碼演示部分將採用 Python 來編寫。
爲什麼選擇銳雯?
因爲銳雯的技能很適合講解門面模式。
大家都知道 IG.theshy 的成名英雄不是劍魔而是銳雯。
他在打職業之前是韓服第一銳雯,操作簡直 666。
銳雯基本操作是什麼?
光速 QA 的連招順序爲:A-Q-地板-A-Q-地板-A-Q-地板-A, 一套傷害打下來是很猛的,今天我們就以銳雯的光速 QA 作爲例子,來看看設計模式中的門面模式是怎麼回事。
我可以選擇其它英雄麼?
當然可以,你可以選擇你擅長的英雄來理解門面模式,這並不影響你收割知識。
光速 QA 的過程
都聽過光速 QA,但是你瞭解它的過程麼?A Q A Q A Q A 就完事了?
要是這樣,那就很簡單了,事實上英雄聯盟有施法技能前搖動畫和後搖動畫,就是因爲這些動畫影響了英雄在技能釋放時的連貫性,而光速 QA 就是利用人物移動的操作來抵消技能的前搖和後搖動畫。我們來看一看,光速 QA 的過程是什麼:
1.首先平 A 一下敵人; 2.以最快的速度接 Q 技能; 3.接着飛速點擊一下地板; 4.最後神速的將鼠標移動到回你要攻擊的目標上。
上面是光速 QA 的第一段操作,它需要你操作 4 次,而光速 QA 總共有 3 段,意味着你要將上面的操作循環 3 次,總共就是 12 次操作。
這也就是爲什麼,只要練成了銳雯的光速 QA ,就能夠在短時間內打出爆發性的傷害,讓對面的上單心慌慌…
用 Python 代碼表示光速 QA
說明一下,代碼是用來表示過程以及比喻技能的(槓精請繞道),介紹一下,英雄聯盟的英雄技能按鍵分佈在 Q-W-E-R 四個鍵,所以遊戲中大家將各個技能的名稱簡述爲 Q 技能、W 技能、E 技能、R 技能,這裏我們還需要鍵盤和鼠標的操作。
Python 代碼表示鍵盤技能
class KeyBoard(object): """ 鍵盤 """ def keyboard_q(self): # Q 技能 print("釋放 Q 技能") def keyboard_w(self): # W 技能 print("釋放 W 技能") def keyboard_e(self): # E 技能 print("釋放 E 技能") def keyboard_r(self): # R 技能 print("釋放 R 技能")
### Python 代碼表示鼠標操作
python class Mouse(object): ¨K22K
這樣就構成了最基本的技能和鼠標基礎操作。
接下來我們使用銳雯的第一段 QA 操作:
if __name__ == "__main__": keyboard = KeyBoard() mouse = Mouse() # 接下來開始使用光速 QA 操作的第一輪: A-> Q-> 地板-> A mouse.mouse_left_click() # A keyboard.keyboard_q() # Q mouse.mouse_right_click() # 地板 mouse.mouse_left_click() # A
第一段 QA 操作
運行這段代碼,我們就可以實現銳雯的第一段 QA 操作:
鼠標左鍵點擊 1 次, A 攻擊 釋放 Q 技能 鼠標左鍵點擊 1 次, A 攻擊 釋放 Q 技能 鼠標左鍵點擊 1 次, A 攻擊 釋放 Q 技能 鼠標左鍵點擊 1 次, A 攻擊
如果需要 3 段 QA 操作,那麼就將上方的代碼複製三份。
光速 QA 快捷鍵與門面模式
英雄聯盟有快捷鍵的,可以讓你簡單的使出光速 QA 操作,那麼這個快捷鍵我們就可以理解爲 “門面模式”。快捷鍵將這些操作歸納起來,你只需要設置好快捷鍵,就能夠一次性使出光速 QA。門面模式 UML 圖爲:
門面模式的光速 QA 代碼
將圖形轉化爲實際的代碼,首先保持原來的鍵盤和鼠標操作不變:
class KeyBoard(object): """ 鍵盤 """ def keyboard_q(self): # Q 技能 print("釋放 Q 技能") def keyboard_w(self): # W 技能 print("釋放 W 技能") def keyboard_e(self): # E 技能 print("釋放 E 技能") def keyboard_r(self): # R 技能 print("釋放 R 技能") class Mouse(object): def mouse_left_click(self): # 鼠標左鍵 print("鼠標左鍵點擊 1 次, A 攻擊") def mouse_right_click(self): # 鼠標右鍵 print("鼠標右鍵點擊 1 次, 點擊地面")
接着通過定義一個 Facade 類,將原來的鍵鼠操作組成一套連招:
class Facade(object): """ 門面模式 """ def __init__(self): self.keyboard = KeyBoard() self.mouse = Mouse() def quick_attack(self): # 快速攻擊 self.mouse.mouse_left_click() # A self.keyboard.keyboard_q() # Q self.mouse.mouse_right_click() # 地板 self.mouse.mouse_left_click() # A
再編寫一個召喚師,讓召喚師對 Facade (可以將 Facade 理解爲英雄聯盟的快捷鍵)進行操作:
class Client(object): def __init__(self): print("斷劍重鑄之日 騎士歸來之時") def combo(self): # 技能連招 operation = Facade() operation.quick_attack() def moves(self): print("走位移動")
爲了更貼近真實操作,我們還可以爲召喚師增加走位功能。
至此,門面模式所需的類和代碼都編寫完了,我們來看看召喚師如何使用:
if __name__ == "__main__": client = Client() # 召喚師 # 召喚師 釋放連招 - 調整走位 - 釋放連招 - 調整走位 - 釋放連招 client.combo() client.moves() client.combo() client.moves() client.combo()
以上就完成了 3 段 QA 操作,運行一下代碼,看看會發生什麼:
斷劍重鑄之日 騎士歸來之時 鼠標左鍵點擊 1 次, A 攻擊 釋放 Q 技能 鼠標右鍵點擊 1 次, 點擊地面 鼠標左鍵點擊 1 次, A 攻擊 走位移動 鼠標左鍵點擊 1 次, A 攻擊 釋放 Q 技能 鼠標右鍵點擊 1 次, 點擊地面 鼠標左鍵點擊 1 次, A 攻擊 走位移動 鼠標左鍵點擊 1 次, A 攻擊 釋放 Q 技能 鼠標右鍵點擊 1 次, 點擊地面 鼠標左鍵點擊 1 次, A 攻擊
是不是完成了所有的連招操作,形成了光速 QA 呢(槓精請繞路)?
想要完整代碼和 UML 圖,可以在公衆號回覆『銳雯』即可獲得代碼下載鏈接
寫法對比
回顧一下常規寫法,有鍵盤、鼠標,召喚師釋放 1 段 QA 操作需要共 4 步,它們之間的關係如下圖所示:
那麼 3 段 QA 就需要 3 組
而門面模式的寫法,則是將所需的一組複雜操作封裝起來,從而爲外部的召喚師提供一個舒適、簡單的操作,它由門面、客戶端(召喚師)、一組系統(Q、A 以及鼠標左/右鍵操作)三部分組成,像下圖所繪,每一組操作包裹在 Facade 中,召喚師需要釋放連招只需要調用 1 次 Facade 即可。
想要完整代碼和 UML 圖,可以在公衆號回覆『銳雯』即可獲得代碼下載鏈接
用 UML 圖表示他們的關係: