一看就懂!【英雄联盟锐雯】与 Python 详解设计模式之门面模式

2,228 阅读8分钟

冠军之刃-锐雯

【网络配图】

设计模式(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 代码表示鼠标操作


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 操作

运行这段代码,我们就可以实现锐雯的第一段 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 呢(杠精请绕路)?

写法对比

回顾一下常规写法,有键盘、鼠标,召唤师释放 1 段 QA 操作需要共 4 步,它们之间的关系如下图所示:

那么 3 段 QA 就需要 3 组

而门面模式的写法,则是将所需的一组复杂操作封装起来,从而为外部的召唤师提供一个舒适、简单的操作,它由门面、客户端(召唤师)、一组系统(Q、A 以及鼠标左/右键操作)三部分组成,像下图所绘,每一组操作包裹在 Facade 中,召唤师需要释放连招只需要调用 1 次 Facade 即可。

用 UML 图表示他们的关系:

关注公众号,可以领取上方所用代码及 UML 图

你还能联想到哪一些英雄呢?那些英雄的技能是不是也可以用设计模式来理解?

请在文章下方留言,看看你喜欢哪个英雄多一点。

IG 牛批、S8 冠军牛批...!