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

冠军之刃-锐雯

大家如果喜欢高质量的 Python 文章,可以在掘金找我:掘金个人主页

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

设计模式有很多中,但可以把它们归为三类:

  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式

而 “门面模式” (也称外观模式)也是众多设计模式的一种,它属于结构型设计模式。

什么是门面模式(Facade)?

为子系统中的一组接口提供一个一致的界面

image

Facade 模式定义了一个高层接口,这个接口使得这子系统更加容易使用。

什么时候需要使用门面模式?

在以下情况下可以考虑使用外观模式:

(1)设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。

(2) 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。

(3) 维护一个大型遗留系统

门面模式解决了什么问题?

(1)实现了子系统与客户端之间的松耦合关系。

(2)客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。

这不是 S8 刚过,蹭一波 IG牛批 的热度,我们通过英雄联盟的角色 -- 锐雯,来理解门面模式。我是一名爬虫工程师,常用 Python ,所以接下来的代码演示部分将采用 Python 来编写。

为什么选择锐雯?

因为锐雯的技能很适合讲解门面模式。

大家都知道 IG.theshy 的成名英雄不是剑魔而是锐雯。

image

他在打职业之前是韩服第一锐雯,操作简直 666。

锐雯基本操作是什么?

光速 QA 的连招顺序为:A-Q-地板-A-Q-地板-A-Q-地板-A, 一套伤害打下来是很猛的,今天我们就以锐雯的光速 QA 作为例子,来看看设计模式中的门面模式是怎么回事。

我可以选择其它英雄么?

image

当然可以,你可以选择你擅长的英雄来理解门面模式,这并不影响你收割知识。

光速 QA 的过程

image

都听过光速 QA,但是你了解它的过程么?A Q A Q A Q A 就完事了?

要是这样,那就很简单了,事实上英雄联盟有施法技能前摇动画和后摇动画,就是因为这些动画影响了英雄在技能释放时的连贯性,而光速 QA 就是利用人物移动的操作来抵消技能的前摇和后摇动画。我们来看一看,光速 QA 的过程是什么:

1.首先平 A 一下敌人;
2.以最快的速度接 Q 技能;
3.接着飞速点击一下地板;
4.最后神速的将鼠标移动到回你要攻击的目标上。

上面是光速 QA 的第一段操作,它需要你操作 4 次,而光速 QA 总共有 3 段,意味着你要将上面的操作循环 3 次,总共就是 12 次操作。

image

这也就是为什么,只要练成了锐雯的光速 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 呢(杠精请绕路)?

image

写法对比

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

image

那么 3 段 QA 就需要 3 组

image

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

image

用 UML 图表示他们的关系:

image
image
image

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

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

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

image
image

<center>IG 牛批、S8 冠军牛批...!</center>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • 标签: 设计模式初涉 场景引入 相信各位玩过LOL英雄联盟游戏的童鞋,对下面两个英雄都不会陌生吧: 分别是瑞雯和盲...
    coder_pig阅读 366评论 0 0
  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 3,732评论 0 14
  • 一:门面模式的定义 外观模式的目的不是给予子系统添加新的功能接口,而是为了让外部减少与子系统内多个模块的交互,松散...
    时待吾阅读 894评论 0 0
  • 我来解释一下标题的意思吧,我和我闺蜜认识9年,在她心里9年友情比不上一个认识不到1年的男生。 事情是这样的,那次是...
    顾言儿阅读 259评论 0 0
  • “您已经跑了10公里,耗时一小时七分钟十秒。上一公里耗时六分钟三十五秒。” 跑步APP的五公里报时如期传来。随之而...
    半点正经阅读 723评论 8 10