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 相关文章推荐
为查询结果建立向后/向前按钮
Oct 09 PHP
phpwind中的数据库操作类
Jan 02 PHP
PHP中其实也可以用方法链
Nov 10 PHP
shopex主机报错误请求解决方案(No such file or directory)
Dec 27 PHP
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
Jul 01 PHP
支持中文、字母、数字的PHP验证码
May 04 PHP
PHP正则验证Email的方法
Jun 15 PHP
php版微信小店调用api示例代码
Nov 12 PHP
php中static和const关键字用法分析
Dec 07 PHP
PHP实现的获取文件mimes类型工具类示例
Apr 08 PHP
详解关于php的xdebug配置(编辑器vscode)
Jan 29 PHP
Laravel修改验证提示信息为中文的示例
Oct 23 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
apache和php之间协同工作的配置经验分享
2013/04/08 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
php实现的zip文件内容比较类
2014/09/24 PHP
YII CLinkPager分页类扩展增加显示共多少页
2016/01/29 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
2016/11/29 PHP
PHP上传文件及图片到七牛的方法
2018/07/25 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
Jquery搜索父元素操作方法
2015/02/10 Javascript
javascript 闭包详解
2015/02/15 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
js实现延迟加载的几种方法
2017/04/24 Javascript
vue+php实现的微博留言功能示例
2019/03/16 Javascript
VUE 实现复制内容到剪贴板的两种方法
2019/04/24 Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
2020/12/24 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
2020/03/20 jQuery
Python实现控制台输入密码的方法
2015/05/29 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
python 的 scapy库,实现网卡收发包的例子
2019/07/23 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
Python 取numpy数组的某几行某几列方法
2019/10/24 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
Python中return函数返回值实例用法
2020/11/19 Python
Hello Molly美国:女性时尚在线
2019/08/26 全球购物
俄罗斯建筑和装饰材料在线商店:Stroilandia
2020/07/25 全球购物
方法名是否可以与构造器的名字相同
2012/06/04 面试题
Servlet的生命周期
2013/08/25 面试题
网络工程师个人的自我评价范文
2013/10/01 职场文书
会计学生自我鉴定
2014/02/06 职场文书
实习公司领导推荐函
2014/05/21 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
班主任寄语2015
2015/02/26 职场文书
nginx优化的六点方法
2021/03/31 Servers
Python软件包安装的三种常见方法
2022/07/07 Python