php设计模式之适配器模式实例分析【星际争霸游戏案例】


Posted in PHP onApril 07, 2020

本文实例讲述了php设计模式之适配器模式。分享给大家供大家参考,具体如下:

星际的很多兵种,都有至少一项特殊技能。而且有些兵种的技能是相同的,比如虫族部队都会恢复血。

如果按照一般的思路,把技能的操作和控制作为方法,放在每个兵种的定义类来实现,代码会重复,也不容易修改。

那我们就会考虑用继承的办法,比如我们可以设计一个虫族的基类,里面有受伤后血恢复的方法。

在设计刺蛇(Hydralisk,口水兵)的时候,我们可以让刺蛇类继承虫族基类。

但是刺蛇是可以研发钻地的,而钻地不是刺蛇独有的功能,是虫族地面部队都有的特点,我们也要把钻地作为公共基类。

问题出来了,我们不能同时让刺蛇类继承两个类,这是php不允许的。

待解决的问题:如何混合重用两个类,

思路:继承一个类,把新建其中一个类的对象作为属性,然后通过这个属性来调用第二个类的方法。

适配器(Adapter)模式示例:

<?php
  //虫族基类
  class Zerg
  {
    //血
    public $blood;

    //恢复血的方法
    public function restoreBlood()
    {
      //自动逐渐恢复兵种的血
    }
  }

  //钻地的类
  class Burrow
  {
    //钻地的方法
    public function burrowOperation()
    {
      //钻地的动作,隐形等等
      echo '我钻地了';
    }
  }

  //刺蛇的类
  class Hydralisk extends Zerg
  {
    //把一个属性来存放钻地对象
    public $burrow;

    //构造方法,因为php不允许默认值采用对象,所以通过初始化赋值给$burrow
    public function __construct()
    {
      $this->burrow=new Burrow();
    }

    //钻地的方法
    public function burrowOperation()
    {
      //调用钻地属性存放的对象,使用钻地类的方法
      $this->burrow->burrowOperation();
    }
  }

  //制造一个刺蛇
  $h1 = new Hydralisk();

  //让他钻地
  $h1->burrowOperation();

  //运行输出:我钻地了

?>

用途总结:适配器模式使得一个类可以同时使用两个基础类的功能,跳出了单纯继承的限制。有效的重用多各类。

实现总结:让新的类去继承一个基础类,然后通过新类的属性来存放其他类的对象,通过这些对象来调用其他类的方法.

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP 数组教程 定义数组
Oct 23 PHP
php中全局变量global的使用演示代码
May 18 PHP
使用JSON实现数据的跨域传输的php代码
Dec 20 PHP
php中引用符号(&amp;)的使用详解
Nov 13 PHP
php初始化对象和析构函数的简单实例
Mar 11 PHP
php中fgetcsv()函数用法实例
Nov 28 PHP
smarty中post用法实例
Nov 28 PHP
php+ajax实现无刷新分页
Nov 18 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
Sep 26 PHP
php面向对象之反射功能与用法分析
Mar 29 PHP
PHP实现基于状态的责任链审批模式详解
May 31 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
Oct 14 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
Apr 07 #PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
Apr 06 #PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
Apr 06 #PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
Apr 06 #PHP
Laravel 5+ .env环境配置文件详解
Apr 06 #PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
Apr 06 #PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
Apr 06 #PHP
You might like
让你同时上传 1000 个文件 (一)
2006/10/09 PHP
php中用socket模拟http中post或者get提交数据的示例代码
2013/08/08 PHP
那些年我们错过的魔术方法(Magic Methods)
2014/01/14 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
学习ExtJS TextField常用方法
2009/10/07 Javascript
jQuery dialog 异步调用ashx,webservice数据的代码
2010/08/03 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
javascript date格式化示例
2013/09/25 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
2015/03/16 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
快速使用node.js进行web开发详解
2017/04/26 Javascript
AngularJs 延时器、计时器实例代码
2017/09/16 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
2018/01/10 Javascript
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
JavaScript享元模式原理与用法实例详解
2020/03/09 Javascript
jquery自定义组件实例详解
2020/12/31 jQuery
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
python实现比较两段文本不同之处的方法
2015/05/30 Python
Python实现的径向基(RBF)神经网络示例
2018/02/06 Python
浅谈django 重载str 方法
2020/05/19 Python
Python configparser模块应用过程解析
2020/08/14 Python
大学毕业生最详细的自我评价分享
2013/11/18 职场文书
三个儿子教学反思
2014/02/03 职场文书
2014入党积极分子批评与自我批评思想汇报
2014/09/20 职场文书
2014年保洁工作总结
2014/11/24 职场文书
2015年财务人员工作总结
2015/04/10 职场文书
解决jupyter notebook启动后没有token的坑
2021/04/24 Python
聊聊JS ES6中的解构
2021/04/29 Javascript
Mysql Online DDL的使用详解
2021/05/20 MySQL
python实现MD5进行文件去重的示例代码
2021/07/09 Python
高并发下Redis如何保持数据一致性(避免读后写)
2022/03/18 Redis
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers