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 相关文章推荐
DISCUZ 分页代码
Jan 02 PHP
php采集速度探究总结(原创)
Apr 18 PHP
php实现的简单压缩英文字符串的代码
Apr 24 PHP
比file_get_contents稳定的curl_get_contents分享
Jan 11 PHP
destoon利用Rewrite规则设置网站安全
Jun 21 PHP
PHP中的socket_read和socket_recv区别详解
Feb 09 PHP
php生成rss类用法实例
Apr 14 PHP
php 删除一维数组中某一个值元素的操作方法
Feb 01 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
Apr 20 PHP
Laravel 5.2 文档 数据库 ―― 起步介绍
Oct 21 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
Dec 13 PHP
TP5框架安全机制实例分析
Apr 05 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面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
jQuery之end()和pushStack()使用介绍
2012/02/07 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
2013/12/16 Javascript
以JSON形式将JS中Array对象数组传至后台的方法
2014/01/06 Javascript
JavaScript输入邮箱自动提示实例代码
2014/01/13 Javascript
jQuery拖拽div实现思路
2014/02/19 Javascript
给应用部分的js代码设定一个统一的入口
2014/06/15 Javascript
js解决select下拉选不中问题
2014/10/14 Javascript
JS实现简易图片轮播效果的方法
2015/03/25 Javascript
JavaScript实现自动对页面上敏感词进行屏蔽的方法
2015/07/27 Javascript
5种JavaScript脚本加载的方式
2017/01/16 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
2017/02/15 Javascript
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
浅谈React和Redux的连接react-redux
2017/12/04 Javascript
layui问题之模拟select点击事件的实例讲解
2018/08/15 Javascript
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
2020/02/06 Javascript
[43:24]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.12
2020/12/17 DOTA
教你安装python Django(图文)
2013/11/04 Python
python使用chardet判断字符串编码的方法
2015/03/13 Python
Python使用Mechanize模块编写爬虫的要点解析
2016/03/31 Python
Python中文件I/O高效操作处理的技巧分享
2017/02/04 Python
python用pandas数据加载、存储与文件格式的实例
2018/12/07 Python
Python3网络爬虫中的requests高级用法详解
2019/06/18 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
2019/06/21 Python
python实现函数极小值
2019/07/10 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
2019/12/11 Python
Python常用库大全及简要说明
2020/01/17 Python
Python 如何实现数据库表结构同步
2020/09/29 Python
Spartoo葡萄牙鞋类网站:线上销售鞋履与时尚配饰
2017/01/11 全球购物
面试后感谢信
2014/02/01 职场文书
供电工程专业求职信
2014/08/09 职场文书
倡议书的格式写法
2015/04/28 职场文书
制作能在nginx和IIS中使用的ssl证书
2021/06/21 Servers
使用javascript解析二维码的三种方式
2021/11/11 Javascript