深入分析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编写大型网站问题集
Mar 06 PHP
PHP 使用pcntl和libevent 实现Timer功能
Oct 27 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
Mar 11 PHP
php实现读取超大文件的方法
Jul 28 PHP
php分页函数完整实例代码
Sep 22 PHP
php计算整个目录大小的方法
Jun 01 PHP
PHP获取某个月最大天数(最后一天)的方法
Jul 29 PHP
php实现给一张图片加上水印效果
Jan 02 PHP
php使用escapeshellarg时中文被过滤的解决方法
Jul 10 PHP
Yii2主题(Theme)用法详解
Jul 23 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
Oct 26 PHP
PHP开发api接口安全验证操作实例详解
Mar 26 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中的integer类型使用分析
2010/07/27 PHP
Zend studio文件注释模板设置方法
2013/09/29 PHP
探寻PHP脚本不报错的原因
2014/06/12 PHP
php获取访问者浏览页面的浏览器类型
2017/01/23 PHP
Laravel Reponse响应客户端示例详解
2020/09/03 PHP
很全的显示阴历(农历)日期的js代码
2009/01/01 Javascript
jQuery实现的类flash菜单效果代码
2010/05/17 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
JS+CSS实现带关闭按钮DIV弹出窗口的方法
2015/02/27 Javascript
JS操作JSON方法总结(推荐)
2016/06/14 Javascript
js中json处理总结之JSON.parse
2016/10/14 Javascript
webpack打包单页面如何引用的js
2017/06/07 Javascript
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
2017/06/19 Javascript
vue生成token保存在客户端localStorage中的方法
2017/10/25 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
判断jQuery是否加载完成,没完成继续判断的解决方法
2017/12/06 jQuery
学习jQuery中的noConflict()用法
2018/09/28 jQuery
js最实用string(字符串)类型的使用及截取与拼接详解
2019/04/26 Javascript
javascript使用Blob对象实现的下载文件操作示例
2020/04/18 Javascript
jquery更改元素属性attr()方法操作示例
2020/05/22 jQuery
解决vue的router组件component在import时不能使用变量问题
2020/07/26 Javascript
jQuery+ajax实现文件上传功能
2020/12/22 jQuery
vue实现验证用户名是否可用
2021/01/20 Vue.js
Python下singleton模式的实现方法
2014/07/16 Python
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
python解析xml文件实例分析
2015/05/27 Python
解决pycharm 安装numpy失败的问题
2019/12/05 Python
详解python opencv、scikit-image和PIL图像处理库比较
2019/12/26 Python
护理学毕业生自荐信
2013/10/02 职场文书
2014年健康教育实施方案
2014/02/17 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
党员批评与自我批评发言
2014/10/02 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
Redis+Lua脚本实现计数器接口防刷功能(升级版)
2022/02/12 Redis
python 判断文件或文件夹是否存在
2022/03/18 Python