当前位置: 首页 > 编程日记 > 正文

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

【网络配图】

设计模式(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-> 地板-> Amouse.mouse_left_click()  # Akeyboard.keyboard_q()  # Qmouse.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()  # Aself.keyboard.keyboard_q()  # Qself.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 冠军牛批...!

相关文章:

无法挂载 NTFS格式的分区:mount: unknown filesystem type ‘ntfs’

问题: # mount –t ntfs /dev/sdb1 /mnt/usb mount: unknown filesystem type ‘ntfs’ 这是由于CentOS release 5.3(Final)上无法识别NTFS格式的分区。解决办法: 通过使用 ntfs-3g 来解决。 打开ntfs-3g的下载点http://w…

vs2008 ActiveX控件测试容器的生成以及调试ActiveX控件

1、ActiveX控件测试容器的生成:用TSTCON生成测试容器 http://msdn.microsoft.com/zh-cn/library/f9adb5t5(vvs.90).aspx 在搜索里搜索tstcon,双击TstCon文件夹,将此文件夹里的东西全部复制到另外一个新的空文件里,然后打开解决方案 tstcon.…

百度自动驾驶新突破:获首批T4牌照,升级Apollo 5.0,将进行复杂城市场景路测...

作者 | KYLE WIGGERS等编译 | 夕颜出品 | AI科技大本营(ID:rgznai100)最近,百度自动驾驶项目终于有了进展。先是上周悄然发布了 Apollo 的最新版本 Apollo 5.0,引入一些新功能;昨天下午,北京市自动驾驶测试…

折叠屏就要来了,适配逼死 Android 开发?

1. 异型屏还没适配好,折叠屏就要来了,Android 的碎片化,让开发者又多掉了不少头发。 北京时间 11 月 8 日,三星在旧金山向开发者发布了一款可折叠屏幕手机。并表示,新技术需要开发者调整其 App,以确保在手机…

nginx虚拟目录配置

2019独角兽企业重金招聘Python工程师标准>>> 今天搞了N久的虚拟目录配置,在几乎要放弃的时侯偶然看到一篇文章,将我的问题搞定 原贴地址:http://blog.sina.com.cn/s/blog_6c2e6f1f0100l92h.html 我的需求是这样的,系…

阿里达摩院刷新纪录,开放域问答成绩比肩人类水平,超微软、Facebook

出品 | AI科技大本营(ID:rgznai100)近日,由阿里巴巴达摩院语言技术实验室研发的 Multi-Doc Enriched BERT 模型在微软的 MS MARCO 数 据评测任务,Passage Retrieval Task(文档检索排序)和 Q&A Task&…

解决windows7下vs2008不能正常编译ActiveX控件的问题

在windows7系统中,vs2008环境下用MFC ActiveX Control生成的控件不能正常编译,但是在xp系统中却能正常编译,解决方法: 1、在windows7中编译,提示错误为:fatal error LNK1000: Internal error during IncrB…

什么是shell【TLCL】

常用命令 datecaldf——report file system disk space usagefree——display amount of free and used memory in the systemexit——退出终端Ctrl-Alt-F1 到 Ctrl-Alt-F6 访问后台终端会话,AltF7返回图形桌面转载于:https://www.cnblogs.com/songdechiu/p/9943599…

Linux终端的几个常用快捷方式,记下!

一、初识linux的终端种类:本地、远程    查看本终端命令:     #tty 命令,看到当前所处的终端     #(w)who 命令,看到系统中所有登录的用户 其中,tty 终端为表示在本地命令行模式下打开…

从0到1 | 文本挖掘的传统与深度学习算法

一、什么是文本挖掘?讨论文本挖掘之前,我们要先说一下数据挖掘的概念,因为文本挖掘是数据挖掘的一个分支。数据挖掘(Data Mining)指从大量的数据中通过算法搜索隐藏在其中信息的过程。而文本挖掘就是从文本数据中获取有…

window7系统中64位安装matalbR2009b后出现乱码的解决方案

转自:http://blog.csdn.net/shaoguangleo/archive/2010/11/29/6042194.aspx MATLAB 中默认的字体是 Monospaced (即等宽字体),这是一种非常适合用于显示程序源代码的字体。但Monospaced 是种逻辑字体,它在不同语言和操…

【电路】pmic芯片设计细节

VIO_IN供电https://e2e.ti.com/support/power-management/f/196/t/712146?tisearche2e-sitesearch&keymatchtps65916 Note that every GPIO will be configured as an input for the first 6ms after VCC is supplied, which is the time it takes for the device to init…

sql server 的一些记录

下面记录一些用到sql server查询时候用到的函数。 charindex,在一个表达式中搜索另一个表达式并返回其起始位置(如果找到)。http://msdn.microsoft.com/zh-cn/library/ms186323.aspx CHARINDEX ( expressionToFind ,expressionToSearch [ , start_locati…

[WPF] UserControl vs CustomControl

原文:[WPF] UserControl vs CustomControl介绍 WPF中有两种控件:UserControl和CustomControl,但是这两者有什么区别呢?这篇博客中将介绍两者之间的区别,这样可以在项目中合理的使用它们。 UserControl 将多个WPF控件(例如&#xf…

50行Python代码,获取公众号全部文章

作者 | 胖虎转载自Python3X(ID: python3xxx )爬取公众号的方式常见的有两种:通过搜狗搜索去获取,缺点是只能获取最新的十条推送文章。通过微信公众号的素材管理,获取公众号文章。缺点是需要申请自己的公众号。今天介绍…

解决Windows7下vs2008 Active control test container 不能运行的问题

按照:http://blog.csdn.net/fengbingchun/archive/2011/05/05/6398356.aspx 在windows7系统中,vs2008环境下用MFC ActiveX Control生成的控件不能正常编译,但是在xp系统中却能正常编译,解决方法: 1、在windows7中编译…

入门必备 | 一文读懂神经架构搜索

作者 | Md Ashiqur Rahman编译 | 刘静转载自图灵TOPIA(ID: turingtopia)近期谷歌大脑团队发布了一项新研究:只靠神经网络架构搜索出的网络,不训练,不调参,就能直接执行任务。这样的网络叫做WANN&#xff0c…

脚本化 tmux — LinuxTOY

脚本化 tmux — LinuxTOY脚本化 tmux2012-07-02 Toy Posted in TipsRSS昨天我在家试了下脚本化 tmux,其表现相当令人满意,只需稍加定制便可满足各种实际需要。这或许可以成为抛弃 GNU screen,改用 tmux 的又一个理由。该脚本先判断一个名为 c…

OpenCV像素点处理

转自:http://blog.csdn.net/hxgqh/archive/2011/02/23/6202001.aspx 获得像素点的值便可以更加灵活的进行图像处理,在OpenCV里可以通过cvGet2D()和cvSet2D()两个函数加上一个CvScalar结构体做到。OpenCV中,CvScalar结构为:typedef…

亲 , Zookeeper了解一下 : 概述

2019独角兽企业重金招聘Python工程师标准>>> 在学习的过程中,我们总需要一个来自灵魂的拷问: 为什么? 为什么会产生Zookeeper 这个问题有深度,那要从五百万年说起,在遥远的塞伯坦星球..... 扯远了... 在遥远在单机单服务的时代 , 想要扩展服务 , 只能增加硬件配置 …

wordpress jquery加载如何实现?

2019独角兽企业重金招聘Python工程师标准>>> 为什么写这篇文章? 因为之前在wordpress里面用jquery的时候没注意,这次因为要优化网站把没用的插件删了,结果发现有的jquery功能失效了,调试了许久才发现可能是jQuery没有定…

百度与华为重磅合作!李彦宏:技术是百度的信仰

导语:这是百度第三年举办AI开发者大会。一生二,二生三,三生万物。AI虽然不能产生万物,但是正在“唤醒万物”。 作者 | 阿司匹林 出品 | AI科技大本营(ID:rgznai100) 在今天上午举行的的百度AI开发者大…

已知空间一点到另外两点直线的距离

转自:http://www.cnblogs.com/clarkustb/archive/2008/11/04/1326500.html 已知空间一点到另外两点直线的距离设空间中的三点为M1,M2,M3,分别用矢量a,b表示方向向量M1M2和M1M3,则: 1. M3到M1,M2连线的距离为|axb|/|a|,这里|.|表示向量的…

vue---进行post和get请求

参考文档&#xff1a; https://www.jb51.net/article/125717.htm 使用axios <script src"https://unpkg.com/axios/dist/axios.min.js"></script> 基本使用方法&#xff1a; get请求&#xff1a; // Make a request for a user with a given ID axios.ge…

CxImage图像处理类库

转自&#xff1a;http://blog.csdn.net/byxdaz/archive/2009/04/10/4061324.aspx CxImage是一个可以用于MFC 的C图像处理类库类&#xff0c;它可以打开&#xff0c;保存&#xff0c;显示&#xff0c;转换各种常见格式的图像文件&#xff0c;比如BMP, JPEG, GIF, PNG, TIFF, MNG…

设计模式学习2 工厂模式

工厂模式其实就是简单模式的升级版本&#xff0c; 简单模式将界面与业务逻辑区分开&#xff0c;但是如果不停的增加计算器的运算方式&#xff0c;简单模式中的工厂Factory 中判断的业务逻辑会变非常复杂&#xff0c;这不符合封装的原则。 所以在此之上将Factory抽象了出来&…

输入字符串,包含数字,大小写字母,编程输出出现做多的数字的和

题目描述&#xff1a; 输入字符串&#xff0c;包含数字&#xff0c;大小写字母&#xff0c;编程输出出现做多的数字的和。 思路&#xff1a; 1.创建输入对象2.输入字符串3.利用正则将字母分离出&#xff0c;剩余的每一个字符串即为待统计的每一个数字&#xff0c;存入字符串数组…

优化思路千万种,基于下界函数的最优化效率如何?

作者丨stephenDC来源 | 大数据与人工智能&#xff08;ID:ai-big-data&#xff09;导读&#xff1a;生活中我们处处面临最优化的问题&#xff0c;比如&#xff0c;怎么样一个月减掉的体重最高&#xff1f;怎么样学习效率最高&#xff1f;怎么样可以最大化实现个人价值&#xff1…

Quintum 语音网关设置方法

Quintum 网关基本配置 Quintum 网关基本配置 登陆方式&#xff1a;方法一&#xff1a;串口登陆&#xff08;1&#xff09;&#xff0e;用配套的串口线连接网关的CONSOLE口和电脑的串口。 &#xff08;2&#xff09;&#xff0e;开启电脑的的超级终端&#xff0c;路径如下&#…

Activex test contact failed to create control 未指定的错误 控件无法加载的原因

转自&#xff1a;http://blog.csdn.net/phker/archive/2009/12/25/5073402.aspx 本文指的是vc项目的activex 出现这个问题, 我总结了总共有以下几点,可能还有其他原因: 1.中文问题:如果你的项目类型是多字节的,而不是unicode编码的,你可能要注意这个问题了,我就发生了这个问题…