软件开发中涉及到的设计模式很多,这里重点讨论工作中常见的一些设计模式,围绕王者荣耀中的场景进行展开。
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:其他

设计原则

这些设计模式都是围绕设计原则展开:
开闭原则:对拓展开放,对修改关闭。即:尽量在不修改原有代码的情况下进行拓展。(策略模式就是典型)
单一职责原则:一个类只负责一个功能领域中相应的职责。(单例模式就是典型)
......更多原则见:设计模式之设计模式六大原则

mvc 再理解

原文链接:从王者荣耀谈设计模式​

从王者荣耀谈设计模式相关推荐

  1. 从王者荣耀谈设计模式​

    软件开发中涉及到的设计模式很多,这里重点讨论工作中常见的一些设计模式,围绕王者荣耀中的场景进行展开. 1:策略模式 策略模式demo <?php //1:抽象策略接口:王者荣耀 abstract ...

  2. 从王者荣耀看设计模式(六.状态模式)

    从王者荣耀看设计模式(状态模式) 一.简介 英雄项羽在敌方英雄的攻击下存在3种不同的状态. 1.在健康生命值下--普通状态,在每次被攻击时,当前生命值=剩余生命值-敌方英雄伤害值 2.在生命值低于某一 ...

  3. 从王者荣耀看设计模式(五.组合模式)

    从王者荣耀看设计模式(组合模式) 一.简介 在王者荣耀这款游戏中,我们可以在商店中购买英雄.英雄由法师.射手.打野等职业组合而成,其中各个职业由中国元素的英雄和外国元素的英雄组成,玩家可根据需要挑选并 ...

  4. 从王者荣耀看设计模式(四.简单工厂模式)

    从王者荣耀看设计模式(简单工厂模式) 一.简介 游戏开始前,玩家可从英雄池自由挑选将要出战的英雄 二.简单工厂模式 简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫 ...

  5. 从王者荣耀看设计模式(二.单例模式)

    从王者荣耀看设计模式(单例模式) 一:简介 多个英雄可同时攻击敌方水晶,当水晶血条小于0,游戏结束 二:单例模式 一个类有且仅有一个实例,并且自行实例化向整个系统提供(水晶). 这其中的设计原则有: ...

  6. 从王者荣耀看设计模式(一.策略模式)

    从王者荣耀看设计模式(策略模式) 一:简介 游戏开始前,玩家需要选择英雄,再根据所选择的阵容自由选择召唤师技能,游戏开始,玩家可以控制英雄进行普通攻击和使用召唤师技能攻击 二:策略模式 策略模式将可变 ...

  7. 从王者荣耀看设计模式(十.外观模式)

    ##从王者荣耀看设计模式(外观模式) 一.简介 王者荣耀是由多人协同开发而成,每个人负责游戏的一个或多个子功能,一个完整的功能是由很多已开发的子功能组合成的.我们要玩游戏时,只需要打开王者荣耀APP, ...

  8. 王者荣耀java实现_从王者荣耀看设计模式-策略模式(java版)

    王者荣耀 曾经我也是一名玩农药的大学生,但现在已经弃了,别问我为什么(被坑爹队友坑的哭...).而今天我们来把让农药变荣耀,我们来从王者荣耀中看设计模式的策略模式. 射手 00.分析 我们先来思考,王 ...

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

    从王者荣耀看设计模式(虚拟代理模式) 一.简介 王者荣耀游戏设置了很多种游戏模式,比如:王者模拟战.无限乱斗.梦境大乱斗.火焰山大战等.当从王者荣耀的主界面进入各类模式的界面时,由于网络原因,会存在一 ...

最新文章

  1. Flex精华摘要--使用AS脚本
  2. html表单标签怎么使用,HTML的表单标签使用
  3. 渗透知识-XSS跨站脚本攻击
  4. 数据分析师经常遇到的13个问题
  5. BootStrap导航栏的使用
  6. MySQL在哪里看secret_key_K8S 创建和查看secret(九)
  7. 建模步骤_古建设计 | sketchup建模步骤教程(简易入门版)
  8. 作者:周绮凤,女,博士,厦门大学自动化系副教授。
  9. 3.2 SE11创建数据元素
  10. k-means算法实现python
  11. ubuntu 普通用户下设置tab键自动补全
  12. java不带括号_java – 打印数组,不带括号和逗号
  13. 14. jQuery - 添加元素
  14. E - 白银 CSU - 1726: 你经历过绝望吗?两次! 搜索
  15. logging日志模块 , 序列化json pickle , 随机数random
  16. 电脑常用音频剪辑软件_常用手机视频剪辑软件
  17. 梅特勒托利多xk3124电子秤说明书_托利多电子秤完整操作手册
  18. SpringBoot使用银联支付
  19. 软件测试的概括及流程
  20. Google Play镜像站

热门文章

  1. 打飞碟物理运动兼容版
  2. 产品经理1.2_如何进行需求收集以及需求管理
  3. Python运算符与表达式
  4. 2022年泰迪杯数据分析b题——银行客户忠诚度分析
  5. 我们一直想做什么样的事情?嘴对嘴更新《Elasticsearch从入门到大师系列》
  6. [Excel函数] 关联匹配函数
  7. matlab串口采集频率,matlab之串口数据采集绘图
  8. 分布式系统架构--服务降级和熔断
  9. 老男孩python作业_老男孩python学习第一天作业
  10. 5分钟了解“内部威胁”,企业数据安全的定时炸弹