php设计模式之建造器模式分析【星际争霸游戏案例】


Posted in PHP onJanuary 23, 2020

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

星际里面有不少的任务关,也可以自己编辑地图,画面上有各种地形,建筑和部队。
这存在一个问题,初始化画面的流程很乱。

待解决的问题:完成初始化画面的工作,同时尽量减少各种绘制细节的耦合。

思路:既然星际的画面由几个部分组成:地图(就是地形和矿产),建筑,部队。那么我们把他们看成是零件,组装起来就是最后的产品(整个画面)。

建造器(Builder)模式示例:

<?php
  //规范制造各个零件的接口
  interface Builder
  {
    //制造地图零件
    public function buildMapPart();
    //制造建筑零件
    public function buildBuildingPart();
    //制造部队零件
    public function buildArmyPart();
    //组装零件
    public function getResult();
  }
  //实际建造器类,比如初始化某个任务关
  class ConcreteBuilder implements Builder
  {
    //制造地图零件
    public function buildMapPart()
    {
      //根据任务的设定画上地图
      echo "地图零件\n";
    }
    //制造建筑零件
    public function buildBuildingPart()
    {
      //根据任务的设定画上建筑,包括玩家的和敌人的
      echo "建筑零件\n";
    }
    //制造部队零件
    public function buildArmyPart()
    {
      //根据任务的设定画上部队,包括玩家的和敌人的
      echo "部队零件\n";
    }
    //组装零件
    public function getResult()
    {
      //将所有的东西叠加和处理,形成初始化画面
      echo "组装零件\n";
    }
  }
  //监督类,也就是控制绘制流程的类
  class Director
  {
    //私有属性,确定使用的建造器
    private $builder;
    //构造方法,参数为选定的建造器对象
    public function __construct($builder)
    {
      //确定使用的建造器
      $this->builder = $builder;
    }
    //负责建造流程的方法,调用建造器对象的方法,制造所有零件
    public function buildeAllPart()
    {
      //制造地图零件
      $this->builder->buildMapPart();
      //制造建筑零件
      $this->builder->buildBuildingPart();
      //制造部队零件
      $this->builder->buildArmyPart();
    }
  }
  //假设根据任务关,初始化我们需要的实际建造器对象
  $concreteBuilder = new ConcreteBuilder();
  //初始化一个监督对象
  $director = new Director($concreteBuilder);
  //制造所有零件
  $director->buildeAllPart();
  //最后让建造器组装零件,生成画面
  $concreteBuilder->getResult();
?>

运行结果:

地图零件
建筑零件
部队零件
组装零件

用途总结:建造器模式可以将流程和细节分离,各司其职。

实现总结:需要一个建造器接口或者抽象类,负责规范各个方法,比如上面的Builder。然后让实际的建造器类去实现所有的方法,比如上面的ConcreteBuilder。同时需要负责流程管理的监督类,比如上面的Director,负责调用建造器的各个零件制造方法。最后让建造器去组装所有的零件。

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

PHP 相关文章推荐
php获取mysql版本的几种方法小结
Mar 25 PHP
php产生随机数的两种方法实例代码 输出随机IP
Apr 08 PHP
PHP学习之输出字符串(echo,print,printf,print_r和var_dump)
Apr 17 PHP
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
Jul 17 PHP
探讨:parse url解析URL,返回其组成部分
Jun 14 PHP
ThinkPHP框架设计及扩展详解
Nov 25 PHP
php用户注册时常用的检验函数实例总结
Dec 22 PHP
PHP获取昨天、今天及明天日期的方法
Feb 03 PHP
ThinkPHP静态缓存简单配置和使用方法详解
Mar 23 PHP
mysql查找删除重复数据并只保留一条实例详解
Sep 24 PHP
thinkphp 手机号和用户名同时登录
Jan 20 PHP
phpquery中文手册
Mar 18 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
Jan 23 #PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
Jan 23 #PHP
php面向对象基础详解【星际争霸游戏案例】
Jan 23 #PHP
PHP数据源架构模式之表入口模式实例分析
Jan 23 #PHP
TP3.2.3框架文件上传操作实例详解
Jan 23 #PHP
php的RSA加密解密算法原理与用法分析
Jan 23 #PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
Jan 23 #PHP
You might like
php中session_unset与session_destroy的区别分析
2011/06/16 PHP
初学PHP的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
yii用户注册表单验证实例
2015/12/26 PHP
php实现跨域提交form表单的方法【2种方法】
2016/10/17 PHP
php输出含有“#”字符串的方法
2017/01/18 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
2015/11/23 Javascript
js遍历获取表格内数据的方法(必看)
2017/04/06 Javascript
纯JS实现图片验证码功能并兼容IE6-8(推荐)
2017/04/19 Javascript
vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
2017/04/22 Javascript
理解 Node.js 事件驱动机制的原理
2017/08/16 Javascript
JS实现的JSON序列化操作简单示例
2018/07/02 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
js+canvas实现五子棋小游戏
2020/08/02 Javascript
原生js实现下拉框选择组件
2021/01/20 Javascript
[02:10]三分钟回顾完美世界城市挑战赛
2019/01/24 DOTA
[50:48]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
在Python中操作字典之clear()方法的使用
2015/05/21 Python
python+matplotlib演示电偶极子实例代码
2018/01/12 Python
pandas.DataFrame选取/排除特定行的方法
2018/07/03 Python
python三引号输出方法
2019/02/27 Python
python 检查数据中是否有缺失值,删除缺失值的方式
2019/12/02 Python
解决django中form表单设置action后无法回到原页面的问题
2020/03/13 Python
详解canvas绘制多张图的排列顺序问题
2019/01/21 HTML / CSS
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
澳大利亚先进的皮肤和激光诊所购物网站:Soho Skincare
2018/10/15 全球购物
初中生学习的自我评价
2013/11/14 职场文书
简历自我评价怎么写呢?
2014/01/06 职场文书
完美主义个人的自我评价
2014/02/17 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书
利用python调用摄像头的实例分析
2021/06/07 Python
Python连接Postgres/Mysql/Mongo数据库基本操作大全
2021/06/29 Python
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle
Win11软件图标固定到任务栏
2022/04/19 数码科技