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中判断一个字符串包含另一个字符串的方法
Mar 19 PHP
php 静态变量的初始化
Nov 15 PHP
浅谈PHP与C#的值类型指向区别的详解
May 21 PHP
php和jquery实现地图区域数据统计展示数据示例
Feb 12 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
Jun 12 PHP
ThinkPHP权限认证Auth实例详解
Jul 22 PHP
IIS下PHP的三种配置方式对比
Nov 20 PHP
PHP实现过滤各种HTML标签
May 17 PHP
整理php防注入和XSS攻击通用过滤
Sep 13 PHP
iis6手工创建网站后无法运行php脚本的解决方法
Jun 08 PHP
THINKPHP3.2使用soap连接webservice的解决方法
Dec 13 PHP
Laravel+Intervention实现上传图片功能示例
Jul 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 身份证号验证函数
2009/05/07 PHP
PHP 将图片按创建时间进行分类存储的实现代码
2010/01/05 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
php中is_null,empty,isset,unset 的区别详细介绍
2013/04/28 PHP
Java和PHP在Web开发方面对比分析
2015/03/01 PHP
PHP实现简单爬虫的方法
2015/07/29 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
Cookie 注入是怎样产生的
2009/04/08 Javascript
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
JS关闭窗口或JS关闭页面的几种代码分享
2013/10/25 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
2016/08/23 Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
2017/01/23 Javascript
微信小程序实现带刻度尺滑块功能
2017/03/29 Javascript
Vue响应式原理深入解析及注意事项
2017/12/11 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
2018/03/13 Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
2018/03/13 Javascript
Next.js实现react服务器端渲染的方法示例
2019/01/06 Javascript
vue element 生成无线级左侧菜单的实现代码
2019/08/21 Javascript
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
python实现问号表达式(?)的方法
2013/11/27 Python
python简单读取大文件的方法
2016/07/01 Python
Django中Model的使用方法教程
2018/03/07 Python
Python序列循环移位的3种方法推荐
2018/04/09 Python
python读取几个G的csv文件方法
2019/01/07 Python
解决Mac下使用python的坑
2019/08/13 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
python Canny边缘检测算法的实现
2020/04/24 Python
Python三维绘图之Matplotlib库的使用方法
2020/09/20 Python
贝玲妃英国官网:Benefit英国
2018/02/03 全球购物
UGG澳洲官网:UGG Australia
2018/04/26 全球购物
英国助听器购物网站:Hearing Direct
2018/08/21 全球购物
工程测量与监理专业应届生求职信
2013/11/27 职场文书
抗洪救灾标语
2014/10/08 职场文书
2014年医药代表工作总结
2014/11/22 职场文书
SQL CASE 表达式的具体使用
2022/03/21 SQL Server
Golang连接并操作MySQL
2022/04/14 MySQL