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 09 PHP
如何在PHP中进行身份认证
Oct 09 PHP
给初学PHP的5个入手程序
Nov 23 PHP
php中实现记住密码自动登录的代码
Mar 02 PHP
php 目录与文件处理-郑阿奇(续)
Jul 04 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
Sep 25 PHP
php小技巧之过滤ascii控制字符
May 14 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
May 28 PHP
初识Laravel
Oct 30 PHP
为PHP5.4开启Zend OPCode缓存
Dec 26 PHP
php7 安装yar 生成docker镜像
May 09 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
Jun 19 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
用PHP实现将GB编码转换为UTF8
2006/11/25 PHP
PHP 高级课程笔记 面向对象
2009/06/21 PHP
php 流程控制switch的简单实例
2016/06/07 PHP
PHP简单实现DES加密解密的方法
2016/07/12 PHP
php和redis实现秒杀活动的流程
2019/07/17 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
2019/09/29 PHP
JavaScript 动态改变图片大小
2009/06/11 Javascript
javascript中将Object转换为String函数代码 (json str)
2012/04/29 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
2013/01/11 Javascript
js Dialog 去掉右上角的X关闭功能
2014/04/23 Javascript
javascript实现添加附件功能的方法
2015/11/18 Javascript
vue-router实现webApp切换页面动画效果代码
2017/05/25 Javascript
React.Js添加与删除onScroll事件的方法详解
2017/11/03 Javascript
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
利用CDN加速react webpack打包后的文件详解
2018/02/22 Javascript
jQuery中图片展示插件highslide.js的简单dom
2018/04/22 jQuery
create-react-app修改为多页面支持的方法
2018/05/17 Javascript
Angular 利用路由跳转到指定页面的指定位置方法
2018/08/31 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
JavaScript实现简单的弹窗效果
2020/05/19 Javascript
微信小程序实现拨打电话功能的示例代码
2020/06/28 Javascript
原生js滑动轮播封装
2020/07/31 Javascript
Selenium执行JavaScript脚本的方法示例
2020/12/31 Javascript
[03:56]DOTA2完美大师赛趣味视频之小鸽子和Mineski打台球
2017/11/24 DOTA
Python批量修改文本文件内容的方法
2016/04/29 Python
Python中几种导入模块的方式总结
2017/04/27 Python
python利用正则表达式排除集合中字符的功能示例
2017/10/10 Python
python抓取网站的图片并下载到本地的方法
2018/05/22 Python
使用Django连接Mysql数据库步骤
2019/01/15 Python
Python3.5内置模块之random模块用法实例分析
2019/04/26 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
2021/01/29 Python
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
2015年社区纪检工作总结
2015/04/21 职场文书
《岳阳楼记》原文、译文赏析
2019/09/10 职场文书