从王者荣耀谈设计模式?

软件开发中涉及到的设计模式很多,这里重点讨论工作中常见的一些设计模式,围绕王者荣耀中的场景进行展开。

1:策略模式

策略模式demo

<?php

//1:抽象策略接口:王者荣耀

abstract class kingGlory{

abstract function showTime();

}

//2:具体策略角色

//鲁班

class luban extends kingGlory{

public function showTime(){

echo  ‘猥琐发育,躲坦克后面‘;

}

}

//王昭君

class wangzhaojun extends kingGlory{

public function showTime(){

echo ‘冰杖一技能减速,二技能冰住人才开大‘;

}

}

//东皇太一

class dragon extends kingGlory{

public function showTime(){

echo ‘保护射手,把大留给对方刺客‘;

}

}

//小乔

class xiaoqiao extends kingGlory{

public function showTime(){

echo ‘二技能没让对方起飞,不随便开大入场‘;

}

}

//以后再上新什么角色,在这里扩展方法就好。

//3:环境角色:王者峡谷

class canyonKingGlory{

private $canyonKingGlory;

//获取具体策略

public function getKingGlory($hero){

try{

$strategyReflection = new ReflectionClass($hero);

$this->canyonKingGlory = $strategyReflection->newInstance();

}catch(Exception $e){

throw $e;

}

}

function showTime(){

$this->canyonKingGlory->showTime();

}

}

try{

$hero = empty($_GET[‘hero‘]) ? ‘‘ : trim($_GET[‘hero‘]);

$canyonKingGlory = new canyonKingGlory();

$canyonKingGlory->getKingGlory($hero);

$canyonKingGlory->showTime();

}catch(Exception $e){

print_r($e->getMessage());

}

?>

策略模式组成

  • 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
  • 具体策略角色:包装了相关的算法和行为。
  • 环境角色:持有一个策略类的引用,最终给客户端调用。

一句话理解

你输入的参数最后被程序new 成了对象。如:localhost/kingGlory?hero=luban   程序new luban。

策略模式应用

见和工厂模式pk的应用

2:工厂模式

工厂模式demo

<?php

//1:王者荣耀

abstract class kingGlory{

abstract function showTime();

//击败蓝buff

public function killBlueBuff(){

echo ‘减cd‘;

}

//击败主宰

public function killDominate(){

echo ‘加攻击力;派出小龙‘;

}

}

//鲁班

class luban extends kingGlory{

public function showTime(){

echo  ‘猥琐发育,躲坦克后面‘;

}

public function secondSkill(){

$ability = $this->killDominate();//等等

}

}

//王昭君

class wangzhaojun extends kingGlory{

public function showTime(){

echo ‘冰杖一技能减速,二技能冰住人才开大‘;

}

}

//王者峡谷

class canyonKingGlory{

private $canyonKingGlory;

public function __call($name, $args) {

$this->canyonKingGlory->$name();

}

//获取具体策略

public function getKingGlory($hero){

try{

$strategyReflection = new ReflectionClass($hero);

$this->canyonKingGlory = $strategyReflection->newInstance();

}catch(Exception $e){

throw $e;

}

}

}

try{

$hero = empty($_GET[‘hero‘]) ? ‘‘ : trim($_GET[‘hero‘]);

$canyonKingGlory = new canyonKingGlory();

$canyonKingGlory->getKingGlory($hero);

$canyonKingGlory->secondSkill();

}catch(Exception $e){

print_r($e->getMessage());

}

?>

//http://localhost/single.php?hero=luban

一句话理解

你在框架基类定义了很多公共方法,给大家继承使用。

工厂模式pk策略模式

这两个模式很相似,见上面demo就会有感觉。而且两个模式通常会嵌套在一起使用!

工厂模式:你在框架基类定义了很多公共方法,给大家继承使用。

策略模式:你在框架写了很多继承框架基类的业务代码。

工厂模式pk策略模式应用场景

在王者峡谷,新来的英雄继承峡谷规则:闪现可以穿墙,拿蓝bug减cd , 抢龙有金币经验等...(这就是工厂模式)

新英雄是隐身,是飞天,是同归于尽,是死后重生...可以自由发挥设计...新加一个类就行,而不是switch  case 一个个加。(这就是策略模式)

代码中,一次请求开始要进行 ip检查,登录检查,xss注入转义,日志埋点...这就是工厂模式

开发业务的同学在业务代码里搞物流,搞装修,搞外卖,搞海淘...这就是策略模式

3:适配器模式

适配器demo

<?php

//王者荣耀行为基类

abstract class kingGloryAct{

//过草丛

public abstract function grassBushes();

//过草丛公共方法

public function grassBushesCommom(){

return ‘过草丛隐身‘;

}

}

//鲁班

class luban extends kingGloryAct{

public function grassBushes(){

$effect[] = $this->grassBushesCommom();

return $effect;

}

}

//东皇太一 ;之前有bug 暴露它的球球

class dragon extends kingGloryAct{

public function grassBushes(){

$effect[] = $this->grassBushesCommom();

$effect[] = ‘暴露球球‘;

return $effect;

}

}

//成吉思汗

class erha extends kingGloryAct{

public function grassBushes(){

$effect[] = $this->grassBushesCommom();

$effect[] = ‘加速‘;

return $effect;

}

}

echo ‘<pre/>‘;

$luban = new luban;

print_r($luban->grassBushes());

$dragon = new dragon;

print_r($dragon->grassBushes());

$erha = new erha;

print_r($erha->grassBushes());

?>

注意:代码这样写肯定不简洁,应该结合策略模式写。这里为了便于理解就这样写了。

适配器精髓

利用继承,暴露相同接口。

适配器应用

电源适配,usb适配

典型项目:openapi;微信登录 php,java,C,.net 对接....

4:单例模式

单例模式demo

class singleton{

//1:创建静态私有的变量保存该类对象

static private $instance;

public $config;

//2:一个类在一次请求中只能有一个对象 :私有防止被直接实例化;

private function __construct( $config ){

$this->config = $config;

}

//3:该类提供静态的公有的函数用于创建或获取它本身的静态私有对象。

public static function getInstance($config){

//判断$instance是否是singleton的对象  没有则创建

if (!self::$instance instanceof self) {

self::$instance = new self($config);

}

return self::$instance;

}

//4:防止克隆对象

private function __clone(){

}

public function getConfig(){

print_r($this->config);

}

}

//单例,一次请求只会实例化一次。

$singleton = singleton::getInstance( ‘妲己‘ );// 妲己

$singleton->getConfig();

$singleton = singleton::getInstance(  ‘小乔‘  );// 妲己

$singleton->getConfig();

单例模式组成(三私一公)

  • 私有的静态属性 (保存类的实例)
  • 私有的构造方法 (防止类外实例化)
  • 私有的克隆方法 (防止通过克隆生成对象)
  • 公有的静态方法 (调取这个类相当一个接口 )

单例模式精髓

类只被new一次

单例模式应用

搜索了很多系统代码,只有在数据库连接时有用到。个人觉得原因如下:

1:数据库连接消耗资源,一次请求建立多次连接,数据库扛不住。单例模式可以做到一次请求只会对数据库建立一次连接,而不是多次。这样不容易出现 too many connections情况。

2:单例模式 三私一公 写法相对麻烦,除了数据库连接外,效果不明显。

5:外观模式

外观模式应用

优秀文章:外观模式(简单,不写了)

外观模式精髓

一个方法集成了多个动作。

外观模式应用

妲己蹲草丛,调用二技能,大招,一技能收割。就可以封装个妲己蹲草丛的方法。

删除商户,需要删除店铺,删除菜品,删除点评(逻辑删除)。就需要封装删除商户的方法。

6:其他

这些设计模式都是围绕设计原则展开:

开闭原则:对拓展开放,对修改关闭。即:尽量在不修改原有代码的情况下进行拓展。(策略模式就是典型)

单一职责原则:一个类只负责一个功能领域中相应的职责。(单例模式就是典型)

......更多原则见:设计模式之设计模式六大原则

来源:从王者荣耀谈设计模式? *  邹振忠的博客

原文地址:https://www.cnblogs.com/adair123/p/9777051.html

时间: 2024-10-10 22:22:28

从王者荣耀谈设计模式?的相关文章

从王者荣耀看设计模式(九.命令模式)

从王者荣耀看设计模式(命令模式) 一.简介 王者荣耀是一款团队竞技游戏.良好的团队信息交流在一定程度上能帮助队伍取得胜利.为了保证游戏的流畅性与便捷性,王者荣耀提供了快捷交流机制,在王者小地图旁边有几个快捷聊天按钮(开始撤退,发起进攻,请求结合),玩家可通过点击快捷聊天按钮发出相应命令与队友进行交流 二.命令模式 命令模式(Command Pattern):命令模式是一种高内聚的模式,将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作.

从王者荣耀看设计模式(虚拟代理模式)

从王者荣耀看设计模式(虚拟代理模式) 一.简介 王者荣耀游戏设置了很多种游戏模式,比如:王者模拟战.无限乱斗.梦境大乱斗.火焰山大战等.当从王者荣耀的主界面进入各类模式的界面时,由于网络原因,会存在一定程度的延时(会有一个圈圈在主界面一直转啊转啊转(??へ??╬)),直到加载完图片,会跳转到各模式界面. 二.虚拟代理(作为创建开销大的对象的代表) 虚拟代理是作为创建开销大的对象的代表.虚拟代理经常直到我们真正需要一个对象的时候才创建它.当对象在创建前和创建中时,由虚拟代理来扮演对象的替身.对象创

从王者荣耀看设计模式(保护代理模式)

从王者荣耀看设计模式(保护模式) 一.简介 打开王者荣耀,点击右上角头像标志可进入我的信息主页.在我的个人主页中,我可以可设置玩家的游戏昵称,性别,常用英雄.除此之外,我还可以查看自己得到别人点赞的次数(不能给自己点赞);其他玩家亦可访问我的主页,可以给我点赞,可以查看我设置的所有信息(不能更改). 二.保护代理(控制用户的访问权限) 保护代理,是提供某些级别的保护,根据客户的权限和决定客户可否访问哪些特定的方法,所以保护代理可能只提供给客户部分接口. 三.Java动态代理 Java在java.

从王者荣耀看设计模式(十四.工厂方法模式)

从王者荣耀看设计模式(工厂方法模式) 二.简介 王者荣耀游戏设计师根据英雄技能.属性.天赋等因素,将英雄划分为射手.辅助.打野.法师.坦克.战士等职业.一局比赛存在多类英雄可供选择.玩家在挑选游戏英雄时,合理的英雄职业搭配是赢得游戏胜利的基本保证. 三.工厂方法模式 工厂方法模式(Factory Method Pattern):工厂方法模式又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式.在

从王者荣耀看设计模式(十六.建造者模式)

从王者荣耀看设计模式(建造者模式) 一.简介 为了玩王者荣耀的游戏体验感,不少玩家都会选择花钱购买自己常用英雄的皮肤.一方面,购买的皮肤通常要比原画更加"炫酷".另一方面,购买的英雄皮肤常常伴随有特殊的回城特效与攻击技能特效. 二.模式动机 不管在生活中还是软件系统中,都存在一个包含多个组成部件的复杂对象,如汽车,它包括车轮.方向盘.发动机等各种部件.组成复杂对象的这些部件之间或许还会一定的约束,若某些属性没有赋值可能无法构成完整产品使用.如,电子邮件包含地址.收件人姓名.联系方式.创

从王者荣耀看设计模式(十七.原型模式)

从王者荣耀看设计模式(原型模式) 一.简介 王者荣耀包含有很多的玩法,其中有一种游戏模式只在周六和周日开放,那就是--克隆模式.与常规的游戏双方阵营只允许出现单一英雄不同,在克隆模式中,双方各选择一个英雄进行克隆,换句话说,一个阵营的五个人操作的五个相同的英雄 二.模式动机 在软件系统中,有些对象的创建过程比较复杂,而且有时候需要频繁创建,原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的意图所在. 三.原型模式 原型模式

从王者荣耀看设计模式(二十一.中介者模式)

从王者荣耀看设计模式(中介者模式) 一.简介 在王者荣耀中,有一个简单的聊天室,在聊天室中.玩家点击综合可以与全服的玩家发送消息,点击好友可向指定好友玩家私发信息.|??ω?` ) 二.模式动机 联合国是一个协调组织,各个国家就一些共同问题经由联合国进行协商,它取代了原本各个国家之间的直接交流,将各个成员国之间的强耦合关系转换为较为松散的耦合关系.在软件开发中,我们有时候也会需要使用类似联合国一样的中间对象来降低系统中类与类,对象与对象之间的耦合关系. 在本实例中,玩家与玩家多对多的通信,导致用

从王者荣耀 谈时序图?

王者荣耀实例 case: 我方:我鲁班,安琪拉,妲己,东皇,孙悟空 打大龙. 对方后羿前来抢龙. 我方安琪拉被大龙打死. 我方击杀大龙获取经验和龙兵. 后羿击杀残血妲己. 东皇控住后羿被我击杀,孙悟空助攻. 时序图 时序图是什么 简介:是显示对象之间交互的图,这些对象是按时间顺序排列的. 组成元素:对象.生命线.控制焦点.消息等. 时序图作用及特点 作用: 理清复杂对象关系.如三国人物事件关系 时序图pk流程图 流程图 流程图着重描述处理过程:时序图 关注对象的行为,而非系统的处理过程. 时序图

当我谈《王者荣耀》时我谈些什么

序言 2016/09/09是我入职xxx公司的第一天,进入xx项目组,6名成员,项目需求调研已结束-开发初期... 一.资源 一场游戏大多时候开始就能预测出来输赢了,怎么看的?选人啊!!做项目也是如此,成员元素的配置是项目能否长期持续顺利开展的重要因素之一.上图中诸葛亮输出爆发很高,但是5个诸葛亮在游戏中就很强了吗?这个吃技能及cd,皮脆的英雄对面一波卡技能间隙冲脸轻松干掉你...项目组中也是,在专业技能之外,性格因素,持续学习能力.沟通能力等也是资源配置中的重要指标. 二.规则.样板.复查 2