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产生随机字符串函数
Dec 06 PHP
理解php Hash函数,增强密码安全
Feb 25 PHP
php中判断数组是一维,二维,还是多维的解决方法
May 04 PHP
destoon安全设置中需要设置可写权限的目录及文件
Jun 21 PHP
PHP中的类型提示(type hinting)功能介绍
Jul 01 PHP
腾讯CMEM的PHP扩展编译安装方法
Sep 25 PHP
简单的自定义php模板引擎
Aug 26 PHP
PHP生成word文档的三种实现方式
Nov 14 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
Jun 04 PHP
thinkPHP框架动态配置用法实例分析
Jun 14 PHP
PHP+iframe模拟Ajax上传文件功能示例
Jul 02 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
咖啡与牛奶
2021/03/03 冲泡冲煮
Codeigniter注册登录代码示例
2014/06/12 PHP
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
PHP查找与搜索数组元素方法总结
2015/06/12 PHP
php数组比较实现查找连续数的方法
2015/07/29 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
javascript 写类方式之九
2009/07/05 Javascript
js 鼠标拖动对象 可让任何div实现拖动效果
2009/11/09 Javascript
JavaScript判断一个URL链接是否有效的实现方法
2011/10/08 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
js 限制input只能输入数字、字母和汉字等等
2013/12/18 Javascript
充分发挥Node.js程序性能的一些方法介绍
2015/06/23 Javascript
总结在前端排序中遇到的问题
2016/07/19 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
响应式框架Bootstrap栅格系统的实例
2017/12/19 Javascript
Javascript获取某个月的天数
2018/05/30 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
[jQuery] 事件和动画详解
2019/03/05 jQuery
微信公众号平台接口开发 获取微信服务器IP地址方法解析
2019/08/14 Javascript
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
Python函数调用追踪实现代码
2020/11/27 Python
运动会广播稿20字
2014/02/18 职场文书
培训班开班仪式主持词
2014/03/28 职场文书
森林病虫害防治方案
2014/06/02 职场文书
生产助理岗位职责
2014/06/18 职场文书
2014年学生会工作总结
2014/11/07 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
放飞理想主题班会
2015/08/14 职场文书
2016年基层党组织公开承诺书
2016/03/25 职场文书
详解Redis集群搭建的三种方式
2021/05/31 Redis
redis 存储对象的方法对比分析
2021/08/02 Redis
Python Matplotlib库实现画局部图
2021/11/17 Python