深入分析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 12 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
Dec 02 PHP
关于Laravel Route重定向的一个注意点
Jan 16 PHP
php实现保存周期为1天的购物车类
Jul 07 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
PHP使用mongoclient简单操作mongodb数据库示例
Feb 08 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
Jun 25 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
Aug 23 PHP
php引用和拷贝的区别知识点总结
Sep 23 PHP
PHP常见的序列化与反序列化操作实例分析
Oct 28 PHP
PHP Pipeline 实现中间件的示例代码
Apr 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函数
2010/02/16 PHP
php模板函数 正则实现代码
2012/10/15 PHP
深入理解:XML与对象的序列化与反序列化
2013/06/08 PHP
PHP批量删除、清除UTF-8文件BOM头的代码实例
2014/04/14 PHP
php实现遍历目录并删除指定文件中指定内容
2015/01/21 PHP
php简单获取文件扩展名的方法
2015/03/24 PHP
PHP云打印类完整示例
2016/10/15 PHP
Thinkphp实现短信验证注册功能
2016/10/18 PHP
关于laravel框架中的常用目录路径函数
2019/10/23 PHP
Javascript调试工具(下载)
2007/01/09 Javascript
JS 实现双色表格实现代码
2009/11/24 Javascript
让ie运行js时提示允许阻止内容运行的解决方法
2010/10/24 Javascript
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
关于vue.js弹窗组件的知识点总结
2016/09/11 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
js禁止Backspace键使浏览器后退的实现方法
2017/09/01 Javascript
uin-app+mockjs实现本地数据模拟
2020/08/26 Javascript
JavaScript实现滑块验证解锁
2021/01/07 Javascript
Python运用于数据分析的简单教程
2015/03/27 Python
Python切换pip安装源的方法详解
2016/11/18 Python
python如何重载模块实例解析
2018/01/25 Python
Django开发中复选框用法示例
2018/03/20 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/26 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
python实现各种插值法(数值分析)
2019/07/30 Python
对python中assert、isinstance的用法详解
2019/11/27 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
html5 canvas绘制矩形和圆形的实例代码
2016/06/16 HTML / CSS
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
linux面试题参考答案(8)
2016/04/19 面试题
计算机网络专业推荐信
2013/11/24 职场文书
学生党员思想汇报
2013/12/28 职场文书
先进集体事迹材料范文
2014/12/25 职场文书
2016暑期政治学习心得体会
2016/01/23 职场文书
一文读懂go中semaphore(信号量)源码
2021/04/03 Golang
python unittest单元测试的步骤分析
2021/08/02 Python