設計模式(Design Pattern)是一套被反覆使用、多數人知曉的、通過分類的、代碼設計經驗的總結。使用設計模式的目的:爲了代碼可重用性、讓代碼更容易被他人理解、保證代碼可靠性。設計模式使代碼編寫真正工程化;設計模式是軟件工程的基石脈絡,如同大廈的結構同樣。python
一般被有經驗的面向對象的軟件開發人員所採用。設計模式是軟件開發人員在軟件開發過程當中面臨的通常問題的解決方案。這些解決方案是衆多軟件開發人員通過至關長的一段時間的試驗和錯誤總結出來的。設計模式
設計模式有不少中,但能夠把它們歸爲三類:網絡
而 「門面模式」 (也稱外觀模式)也是衆多設計模式的一種,它屬於結構型設計模式。動畫
爲子系統中的一組接口提供一個一致的界面ui
Facade 模式定義了一個高層接口,這個接口使得這子系統更加容易使用。在如下狀況下能夠考慮使用外觀模式:spa
(1)設計初期階段,應該有意識的將不一樣層分離,層與層之間創建外觀模式。設計
(2) 開發階段,子系統愈來愈複雜,增長外觀模式提供一個簡單的調用接口。3d
(3) 維護一個大型遺留系統code
(1)實現了子系統與客戶端之間的鬆耦合關係。cdn
(2)客戶端屏蔽了子系統組件,減小了客戶端所需處理的對象數目,並使得子系統使用起來更加容易。
這不是 S8 剛過,蹭一波 IG牛批 的熱度,咱們經過英雄聯盟的角色 -- 銳雯,來理解門面模式。我是一名爬蟲工程師,經常使用 Python ,因此接下來的代碼演示部分將採用 Python 來編寫。
由於銳雯的技能很適合講解門面模式。
你們都知道 IG.theshy 的成名英雄不是劍魔而是銳雯。
他在打職業以前是韓服第一銳雯,操做簡直 666。光速 QA 的連招順序爲:A-Q-地板-A-Q-地板-A-Q-地板-A, 一套傷害打下來是很猛的,今天咱們就以銳雯的光速 QA 做爲例子,來看看設計模式中的門面模式是怎麼回事。
要是這樣,那就很簡單了,事實上英雄聯盟有施法技能前搖動畫和後搖動畫,就是由於這些動畫影響了英雄在技能釋放時的連貫性,而光速 QA 就是利用人物移動的操做來抵消技能的前搖和後搖動畫。咱們來看一看,光速 QA 的過程是什麼:
1.首先平 A 一下敵人; 2.以最快的速度接 Q 技能; 3.接着飛速點擊一下地板; 4.最後神速的將鼠標移動到回你要攻擊的目標上。
上面是光速 QA 的第一段操做,它須要你操做 4 次,而光速 QA 總共有 3 段,意味着你要將上面的操做循環 3 次,總共就是 12 次操做。
這也就是爲何,只要練成了銳雯的光速 QA ,就可以在短期內打出爆發性的傷害,讓對面的上單心慌慌...說明一下,代碼是用來表示過程以及比喻技能的(槓精請繞道),介紹一下,英雄聯盟的英雄技能按鍵分佈在 Q-W-E-R 四個鍵,因此遊戲中你們將各個技能的名稱簡述爲 Q 技能、W 技能、E 技能、R 技能,這裏咱們還須要鍵盤和鼠標的操做。
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 次, 點擊地面")
複製代碼
這樣就構成了最基本的技能和鼠標基礎操做。
接下來咱們使用銳雯的第一段 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 操做:
鼠標左鍵點擊 1 次, A 攻擊
釋放 Q 技能
鼠標左鍵點擊 1 次, A 攻擊
釋放 Q 技能
鼠標左鍵點擊 1 次, A 攻擊
釋放 Q 技能
鼠標左鍵點擊 1 次, A 攻擊
複製代碼
若是須要 3 段 QA 操做,那麼就將上方的代碼複製三份。
英雄聯盟有快捷鍵的,可讓你簡單的使出光速 QA 操做,那麼這個快捷鍵咱們就能夠理解爲 「門面模式」。快捷鍵將這些操做概括起來,你只須要設置好快捷鍵,就可以一次性使出光速 QA。門面模式 UML 圖爲:
將圖形轉化爲實際的代碼,首先保持原來的鍵盤和鼠標操做不變:
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 呢(槓精請繞路)?
回顧一下常規寫法,有鍵盤、鼠標,召喚師釋放 1 段 QA 操做須要共 4 步,它們之間的關係以下圖所示:
那麼 3 段 QA 就須要 3 組
而門面模式的寫法,則是將所需的一組複雜操做封裝起來,從而爲外部的召喚師提供一個溫馨、簡單的操做,它由門面、客戶端(召喚師)、一組系統(Q、A 以及鼠標左/右鍵操做)三部分組成,像下圖所繪,每一組操做包裹在 Facade 中,召喚師須要釋放連招只須要調用 1 次 Facade 便可。
用 UML 圖表示他們的關係:
關注公衆號,能夠領取上方所用代碼及 UML 圖你還能聯想到哪一些英雄呢?那些英雄的技能是否是也能夠用設計模式來理解?
請在文章下方留言,看看你喜歡哪一個英雄多一點。