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 上传文件大小限制
Jul 05 PHP
php学习之数据类型之间的转换代码
May 29 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
Sep 28 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
Dec 15 PHP
php实现约瑟夫问题的方法小结
Mar 23 PHP
php编写简单的文章发布程序
Jun 18 PHP
浅谈php中include文件变量作用域
Jun 18 PHP
使用PHP similar text计算两个字符串相似度
Nov 06 PHP
php实现按天数、星期、月份查询的搜索框
May 02 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
Jul 13 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
php获取是星期几的的一些常用姿势
Dec 15 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
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
PHP对象相关知识总结
2017/04/09 PHP
php-fpm开启状态统计的方法详解
2017/06/23 PHP
jQuery 隔行换色 支持键盘上下键,按Enter选定值
2009/08/02 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
javascript获取dom的下一个节点方法
2014/09/05 Javascript
jQuery选择器源码解读(六):Sizzle选择器匹配逻辑分析
2015/03/31 Javascript
JavaScript 数组的深度复制解析
2016/11/02 Javascript
vue.js中指令Directives详解
2017/03/20 Javascript
JavaScript之RegExp_动力节点Java学院整理
2017/06/29 Javascript
vue中使用protobuf的过程记录
2018/10/26 Javascript
JS实现数组去重,显示重复元素及个数的方法示例
2019/01/21 Javascript
微信小程序实现订单倒计时
2020/11/01 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
python3.3实现乘法表示例
2014/02/07 Python
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
机器学习10大经典算法详解
2017/12/07 Python
基于python OpenCV实现动态人脸检测
2018/05/25 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
详解用python写网络爬虫-爬取新浪微博评论
2019/05/10 Python
django fernet fields字段加密实践详解
2019/08/12 Python
浅谈Python类中的self到底是干啥的
2019/11/11 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
2020/03/12 Python
关于Python解包知识点总结
2020/05/05 Python
Python替换NumPy数组中大于某个值的所有元素实例
2020/06/08 Python
.NET remoting的两种通道是什么
2016/05/31 面试题
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
法学毕业生自荐信
2013/11/13 职场文书
森马旗舰店双十一营销方案
2014/09/29 职场文书
四风查摆问题及整改措施
2014/10/10 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
趣味运动会加油词
2015/07/18 职场文书
原生JavaScript实现简单五子棋游戏
2021/06/28 Javascript
Python机器学习实战之k-近邻算法的实现
2021/11/27 Python