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后台多用户权限组思路与实现程序代码分享
Feb 13 PHP
实测在class的function中include的文件中非php的global全局环境
Jul 15 PHP
md5 16位二进制与32位字符串相互转换示例
Dec 30 PHP
使用CodeIgniter的类库做图片上传
Jun 12 PHP
ThinkPHP模板中判断volist循环的最后一条记录的验证方法
Jul 01 PHP
PHP使用Mysql事务实例解析
Sep 08 PHP
分享php分页的功能模块
Jun 16 PHP
Yii2创建多界面主题(Theme)的方法
Oct 08 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
Jul 19 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
May 13 PHP
Yii框架通过请求组件处理get,post请求的方法分析
Sep 03 PHP
PHP sdk文档处理常用代码示例解析
Dec 09 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
全国FM电台频率大全 - 12 安徽省
2020/03/11 无线电
收音机玩机评测 406 篇视频合集
2020/03/11 无线电
PHP:风雨欲来 路在何方?
2006/10/09 PHP
PHP高级对象构建 多个构造函数的使用
2012/02/05 PHP
jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码
2014/10/15 PHP
laravel 5 实现模板主题功能
2015/03/02 PHP
Yii2 rbac权限控制之菜单menu实例教程
2016/04/28 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
浅谈PHP中的面向对象OOP中的魔术方法
2017/06/12 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
2017/08/03 PHP
Django 中 cookie的使用
2017/08/17 PHP
JS下拉框内容左右移动效果的具体实现
2013/07/10 Javascript
纯JavaScript实现的兼容各浏览器的添加和移除事件封装
2015/03/28 Javascript
javascript中sort排序实例详解
2016/07/24 Javascript
BootStrap3中模态对话框的使用
2017/01/06 Javascript
Angular 4.x 路由快速入门学习
2017/05/03 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
2017/05/12 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
vue增删改查的简单操作
2017/07/15 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
微信小程序 确认框的实现(附代码)
2019/07/23 Javascript
Python基类函数的重载与调用实例分析
2015/01/12 Python
Python字典操作简明总结
2015/04/13 Python
python中实现k-means聚类算法详解
2017/11/11 Python
Python实现的特征提取操作示例
2018/12/03 Python
Python通过2种方法输出带颜色字体
2020/03/02 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
Python基于execjs运行js过程解析
2020/11/27 Python
护士专业推荐信
2013/11/02 职场文书
爱情检讨书大全
2014/01/21 职场文书
大学生党员个人总结
2015/02/13 职场文书
歌舞青春观后感
2015/06/10 职场文书
劳保用品管理制度范本
2015/08/06 职场文书
创业计划书之网吧
2019/10/10 职场文书
php 原生分页
2021/04/01 PHP