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 相关文章推荐
Windows下的PHP5.0安装配制详解
Sep 05 PHP
其他功能
Oct 09 PHP
UTF8编码内的繁简转换的PHP类
Jul 09 PHP
php删除数组元素示例分享
Feb 17 PHP
PHP获取本周第一天和最后一天示例代码
Feb 24 PHP
php计算整个目录大小的方法
Jun 01 PHP
php实现QQ空间获取当前用户的用户名并生成图片
Jul 25 PHP
Netbeans 8.2与PHP相关的新特性介绍
Oct 08 PHP
Thinkphp5+uploadify实现的文件上传功能示例
May 26 PHP
在Laravel中使用MongoDB的方法示例
Nov 11 PHP
PHP dirname功能及原理实例解析
Oct 28 PHP
YII2 全局异常处理深入讲解
Mar 24 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
phpmyadmin提示The mbstring extension is missing的解决方法
2014/12/17 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
javascript的键盘控制事件说明
2008/04/15 Javascript
jquery控制左右箭头滚动图片列表的实例
2013/05/20 Javascript
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
动态读取JSON解析键值对的方法
2014/06/03 Javascript
require.js深入了解 require.js特性介绍
2014/09/04 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
浅谈javascript的url参数parse和build函数
2017/03/04 Javascript
纯js实现的积木(div层)拖动功能示例
2017/07/19 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
vue中destroyed方法的使用说明
2020/07/21 Javascript
基于javascript的无缝滚动动画实现2
2020/08/07 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
[07:49]2014DOTA2国际邀请赛 Newbee夺冠后采访xiao8坦言奖金会上交
2014/07/23 DOTA
5种Python单例模式的实现方式
2016/01/14 Python
详解Python 模拟实现生产者消费者模式的实例
2017/08/10 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
2018/06/14 Python
Python全局变量与局部变量区别及用法分析
2018/09/03 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
2020/01/08 Python
对python中 math模块下 atan 和 atan2的区别详解
2020/01/17 Python
Python爬取豆瓣数据实现过程解析
2020/10/27 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
2021/01/05 Python
如何在Oracle中查看各个表、表空间占用空间的大小
2015/10/31 面试题
文史专业毕业生自荐信
2013/11/17 职场文书
室内趣味活动方案
2014/08/24 职场文书
2014年质检工作总结
2014/11/26 职场文书
2015年小学数学教研组工作总结
2015/05/21 职场文书
会计实训总结范文
2015/08/03 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
2016五一劳动节慰问信
2015/11/30 职场文书
Android Flutter实现图片滑动切换效果
2022/04/07 Java/Android