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 strtotime函数详解
Dec 18 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
Aug 18 PHP
PHP代码保护--Zend Guard的使用详解
Jun 03 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
Mar 25 PHP
WordPress开发中的get_post_custom()函数使用解析
Jan 04 PHP
php图片添加文字水印实现代码
Mar 15 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
Jan 07 PHP
php静态成员方法和静态的成员属性的使用方法
Oct 26 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 PHP
PHP chop()函数讲解
Feb 11 PHP
PHP实现八皇后算法
May 06 PHP
PHP实现提高SESSION响应速度的几种方法详解
Aug 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
使用正则去除php代码中的注释方法
2016/11/03 PHP
thinkphp分页集成实例
2017/07/24 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
javascript获取网页中指定节点的父节点、子节点的方法小结
2013/04/24 Javascript
php读取sqlite数据库入门实例代码
2014/06/25 Javascript
js中document.write的那点事
2014/12/12 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
2015/02/27 Javascript
浅析AngularJs HTTP响应拦截器
2015/12/28 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
Vue 过渡(动画)transition组件案例详解
2017/01/22 Javascript
通过fastclick源码分析彻底解决tap“点透”
2017/12/24 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
21行Python代码实现拼写检查器
2016/01/25 Python
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
python3实现ftp服务功能(服务端 For Linux)
2017/03/24 Python
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
Python装饰器语法糖
2019/01/02 Python
Python求正态分布曲线下面积实例
2019/11/20 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
2020/04/30 Python
Python使用re模块验证危险字符
2020/05/21 Python
CSS3 icon font完全指南(CSS3 font 会取代icon图标)
2013/01/06 HTML / CSS
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
分公司经理岗位职责
2013/11/11 职场文书
毕业生就业协议书
2014/04/11 职场文书
员工安全承诺书
2014/05/22 职场文书
法定代表人授权委托书范本
2014/10/07 职场文书
2014年社区妇联工作总结
2014/12/02 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
2015中秋节晚会开场白
2015/07/30 职场文书
小组组名及励志口号
2015/12/24 职场文书
MySQL大小写敏感的注意事项
2021/05/24 MySQL
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL
科学家研发出新型速效酶,可在 24 小时内降解塑料制品
2022/04/29 数码科技
Docker与K8s关系介绍不会Docker也可以使用K8s
2022/06/25 Servers