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脚本的10个技巧(4)
Oct 09 PHP
第二节--PHP5 的对象模型
Nov 16 PHP
php变量范围介绍
Oct 15 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
Feb 17 PHP
PHP实现变色验证码实例
Jan 06 PHP
php json_encode()函数返回json数据实例代码
Oct 10 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
Nov 24 PHP
php实现递归抓取网页类实例
Apr 03 PHP
php 使用html5实现多文件上传实例
Oct 24 PHP
如何离线执行php任务
Feb 21 PHP
Swoole 5将移除自动添加Event::wait()特性详解
Jul 10 PHP
Laravel ORM 数据model操作教程
Oct 21 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
浅析ThinkPHP中execute和query方法的区别
2014/06/13 PHP
php计划任务之ignore_user_abort函数实现方法
2015/01/08 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
php实现统计二进制中1的个数算法示例
2018/01/23 PHP
Jquery 设置标题的自动翻转
2009/10/03 Javascript
分享27款非常棒的jQuery 表单插件
2011/03/28 Javascript
Javascript中的window.event.keyCode使用介绍
2011/04/26 Javascript
javascript模拟实现C# String.format函数功能代码
2013/11/25 Javascript
IE浏览器中图片onload事件无效的解决方法
2014/04/29 Javascript
基于gulp合并压缩Seajs模块的方式说明
2016/06/14 Javascript
jquery实现input框获取焦点的简单实例
2017/01/26 Javascript
ES6新特性之变量和字符串用法示例
2017/04/01 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
Vue切换div显示隐藏,多选,单选代码解析
2020/07/14 Javascript
vue切换菜单取消未完成接口请求的案例
2020/11/13 Javascript
[00:56]跨越时空加入战场 全新祈求者身心“失落奇艺侍祭”展示
2019/07/20 DOTA
python实现简单的TCP代理服务器
2014/10/08 Python
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
Python字典添加,删除,查询等相关操作方法详解
2020/02/07 Python
200行python代码实现贪吃蛇游戏
2020/04/24 Python
使用python采集Excel表中某一格数据
2020/05/14 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
美国知名生活购物网站:Goop
2017/11/03 全球购物
毕业生简单求职信
2013/11/19 职场文书
冰淇淋店创业计划书范文
2013/12/27 职场文书
消防安全员岗位职责
2014/03/10 职场文书
社区道德讲堂实施方案
2014/03/21 职场文书
保护环境标语
2014/06/09 职场文书
商场父亲节活动方案
2014/08/27 职场文书
讲文明懂礼貌演讲稿
2014/09/11 职场文书
2014年计划生育工作总结
2014/11/14 职场文书
房地产销售员岗位职责
2015/04/11 职场文书
迎新生欢迎词2015
2015/07/16 职场文书
2015年小学远程教育工作总结
2015/07/28 职场文书
何时使用Map来代替普通的JS对象
2021/04/29 Javascript
Android移动应用开发指南之六种布局详解
2022/09/23 Java/Android