深入分析PHP设计模式


Posted in PHP onJune 15, 2020

1、单例模式

一个类,只能允许有一个对象存在

<?php
class test{
  protected function __construct(){
  }

  public static function getInstance(){
    $_test = new test();
    return $_test;
  }
}
$test = test::getInstance();
var_dump($test);
?>

2、工厂模式

工厂模式,顾名思义,如同工厂一样,你把原材料放入工厂中,出来的是成品,而你并不需要知道工厂里做了什么,工厂模式主要用于解耦。

把对象的创建和使用的过程分开,比如: ClassA 调用 ClassB,那么 ClassA 只调用ClassB 的方法,
至于实例化 ClassB 则在工厂内实现。这样既减少了代码的重复使用,也方便对 ClassB 的后期维护。
如果 ClassB 实例化过程很复杂,使用简单工厂模式就会发现外部无需关注复杂的实例化,只管调用 ClassB 的方法即可,减少错误

interface mysql{ 
  public function connect();
}
 
class mysqli2 implements mysql{
  public function connect(){
    echo 'mysqli';
  }
}
 
class pdo2 implements mysql{
  public function connect(){
    echo 'pdo';
  }
}

class mysqlFactory{
  static public function factory($class_name){
    return new $class_name();
  }
}
$obj = mysqlFactory::factory('pdo2');
$obj->connect();

3、注册模式

注册模式,解决全局共享和交换对象。已经创建好的对象,挂在到某个全局可以使用的数组上,

在需要使用的时候,直接从该数组上获取即可。将对象注册到全局的树上。任何地方直接去访问。

<?php
class Register
{
    protected static $objects;
    function set($alias,$object)//将对象注册到全局的树上
    {
      self::$objects[$alias]=$object;//将对象放到树上
    }
    static function get($name){
      return self::$objects[$name];//获取某个注册到树上的对象
     }
  function _unset($alias)
{
     unset(self::$objects[$alias]);//移除某个注册到树上的对象。
    }
}

\Auto\Register::set('single',$single);
$single = \Auto\Register::get('single');
var_dump($single);

4、适配器模式

将一个类的接口转换成客户希望的另外一个接口。

//目标角色
interface Aims
{
  public function newMethod1();
  public function newMethod2();
}
 
//需要被适配的类(Adaptee)
Class Man
{
  public function oldMethod1()
  {
    echo 'man';
  }
 
  public function oldMethod2()
  {
    echo '男人';
  }
}
 
//需要被适配的类(Adaptee)
Class Woman
{
  public function oldMethod1()
  {
    echo 'woman';
  }
 
  public function oldMethod2()
  {
    echo '女人';
  }
}
 
//适配器,
Class Adapters implements Aims
{
  private $adaptee;
  public function __construct($adaptee)
  {
    $this->adaptee = $adaptee;
  }
 
  public function newMethod1()
  {
    //以少量的代码对被适配者作出适配
    echo 'sex :';
    $this->adaptee->oldMethod1();
  }
 
  public function newMethod2()
  {
    echo 'sex name :';
    $this->adaptee->oldMethod2();
  }
}
 
$adapter1 = new Adapters(new Man);
$adapter1->newMethod1();
$adapter2 = new Adapters(new Woman);
$adapter2->newMethod2();

5、策略模式

这是一个男人和女人的问题,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境。

UserStrategy.php
<?php
/*
 * 声明策略文件的接口,约定策略包含的行为。
 */
interface UserStrategy
{
  function showAd();
  function showCategory();
}

FemaleUser.php
<?php
class FemaleUser implements UserStrategy
{
  function showAd(){
    echo "2016冬季女装";
  }
  function showCategory(){
    echo "女装";
  }
}

MaleUser.php
<?php
class MaleUser implements UserStrategy
{
  function showAd(){
    echo "IPhone6s";
  }
  function showCategory(){
    echo "电子产品";
  }
}

Page.php//执行文件
<?php
require_once 'Loader.php';
class Page
{
  protected $strategy;
  function index(){
    echo "AD";
    $this->strategy->showAd();
    echo "<br>";
    echo "Category";
    $this->strategy->showCategory();
    echo "<br>";
  }
  function setStrategy(UserStrategy $strategy){
    $this->strategy=$strategy;
  }
}

$page = new Page();
if(isset($_GET['male'])){
  $strategy = new MaleUser();
}else {
  $strategy = new FemaleUser();
}
$page->setStrategy($strategy);
$page->index();

6、原型模式

不常用,大的对象类才使用,表现在clone

7、观察者模式

从面向过程的角度来看,首先是观察者向主题注册,注册完之后,主题再通知观察者做出相应的操作,整个事情就完了

/**
 * 事件产生类
 * Class EventGenerator
 */
abstract class EventGenerator
{
  private $ObServers = [];

  //增加观察者
  public function add(ObServer $ObServer)
  {
    $this->ObServers[] = $ObServer;
  }

  //事件通知
  public function notify()
  {
    foreach ($this->ObServers as $ObServer) {
      $ObServer->update();
    }
  }

}

/**
 * 观察者接口类
 * Interface ObServer
 */
interface ObServer
{
  public function update($event_info = null);
}

/**
 * 观察者1
 */
class ObServer1 implements ObServer
{
  public function update($event_info = null)
  {
    echo "观察者1 收到执行通知 执行完毕!\n";
  }
}

/**
 * 观察者1
 */
class ObServer2 implements ObServer
{
  public function update($event_info = null)
  {
    echo "观察者2 收到执行通知 执行完毕!\n";
  }
}

/**
 * 事件
 * Class Event
 */
class Event extends EventGenerator
{
  /**
   * 触发事件
   */
  public function trigger()
  {
    //通知观察者
    $this->notify();
  }
}

//创建一个事件
$event = new Event();
//为事件增加旁观者
$event->add(new ObServer1());
$event->add(new ObServer2());
//执行事件 通知旁观者
$event->trigger();

以上就是深入分析PHP设计模式的详细内容,更多关于PHP设计模式的资料请关注三水点靠木其它相关文章!

PHP 相关文章推荐
PHP重定向的3种方式
Mar 07 PHP
探讨file_get_contents与curl效率及稳定性的分析
Jun 06 PHP
wordpress自定义url参数实现路由功能的代码示例
Nov 28 PHP
PHP代码优化的53个细节
Mar 03 PHP
php实现转换ubb代码的方法
Jun 18 PHP
Apache服务器下防止图片盗链的办法
Jul 06 PHP
php数组生成html下拉列表的方法
Jul 20 PHP
WordPress中获取指定分类及其子分类下的文章数目
Dec 31 PHP
CI框架入门之MVC简单示例
Nov 21 PHP
PHP数组遍历的几种常见方式总结
Feb 15 PHP
php输出文字乱码的解决方法
Oct 04 PHP
laravel请求参数校验方法
Oct 10 PHP
Laravel6.18.19如何优雅的切换发件账户
Jun 14 #PHP
Laravel服务容器绑定的几种方法总结
Jun 14 #PHP
Laravel如何实现适合Api的异常处理响应格式
Jun 14 #PHP
Yii redis集合的基本使用教程
Jun 14 #PHP
php获取小程序码的实现代码(B类接口)
Jun 13 #PHP
laravel admin实现分类树/模型树的示例代码
Jun 10 #PHP
详解php反序列化
Jun 10 #PHP
You might like
PHP实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
js下用eval生成JSON对象
2010/09/17 Javascript
js 处理URL实用技巧
2010/11/23 Javascript
IE 当eval遇上function的处理
2011/08/09 Javascript
js实现带圆角的两级导航菜单效果代码
2015/08/24 Javascript
详解JavaScript时间处理之几个月前或几个月后的指定日期
2016/12/21 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
微信小程序分享海报生成的实现方法
2018/12/10 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
2019/09/10 Javascript
javascript实现函数柯里化与反柯里化过程解析
2019/10/08 Javascript
js中调用微信的扫描二维码功能的实现代码
2020/04/11 Javascript
nginx配置域名后的二级目录访问不同项目的配置操作
2020/11/06 Javascript
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
MySQL中表的复制以及大型数据表的备份教程
2015/11/25 Python
Python中的with语句与上下文管理器学习总结
2016/06/28 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
Python实现学生成绩管理系统
2020/04/05 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
Python HTMLTestRunner可视化报告实现过程解析
2020/04/10 Python
Python操作Elasticsearch处理timeout超时
2020/07/17 Python
利用CSS3伪元素实现逐渐发光的方格边框
2017/05/07 HTML / CSS
日本土著品牌,综合型购物网站:Cecile
2016/08/23 全球购物
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
工商管理本科毕业生求职信范文
2013/10/05 职场文书
村庄环境整治方案
2014/05/15 职场文书
2014优秀大学生简历自我评价
2014/09/15 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
机关保密工作承诺书
2015/05/04 职场文书
八月迷情观后感
2015/06/11 职场文书
2015国庆节66周年标语
2015/07/30 职场文书
2016年圣诞节寄语(一句话)
2015/12/07 职场文书
九大龙王魂骨,山龙王留下躯干骨,榜首死的最憋屈(被捏碎)
2022/03/18 国漫