深入分析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 相关文章推荐
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
Feb 22 PHP
PHP中如何判断AJAX提交的数据
Feb 05 PHP
ThinkPHP缓存方法S()概述
Jun 13 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
Nov 05 PHP
PHP读MYSQL中文乱码的快速解决方法
Oct 01 PHP
微信公众号模板消息群发php代码示例
Dec 29 PHP
给大家分享几个常用的PHP函数
Jan 15 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
Aug 07 PHP
PHP环形链表实现方法示例
Sep 15 PHP
php实现银联商务公众号+服务窗支付的示例代码
Oct 12 PHP
phpstudy后门rce批量利用脚本的实现
Dec 12 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 15 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判断数组中是否存在指定键(key)的方法
2015/03/17 PHP
JS小框架 fly javascript framework
2009/11/26 Javascript
javascript 通用简单的table选项卡实现
2010/05/07 Javascript
js倒计时小程序
2013/11/05 Javascript
浅谈JavaScript实现面向对象中的类
2014/12/09 Javascript
js判断一个字符串是否包含一个子串的方法
2015/01/26 Javascript
javascript实现字符串反转的方法
2015/02/05 Javascript
js实现的Easy Tabs选项卡用法实例
2015/09/06 Javascript
浅析javascript中的事件代理
2015/11/06 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
JavaScript脚本语言是什么_动力节点Java学院整理
2017/06/26 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
2018/08/18 Javascript
原生js实现瀑布流效果
2020/03/09 Javascript
关于ES6尾调用优化的使用
2020/09/11 Javascript
[48:52]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第一局
2016/02/25 DOTA
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
Python多进程编程技术实例分析
2014/09/16 Python
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
老生常谈Python序列化和反序列化
2017/06/28 Python
Python3实现带附件的定时发送邮件功能
2020/12/22 Python
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
python 将列表中的字符串连接成一个长路径的方法
2018/10/23 Python
python for循环输入一个矩阵的实例
2018/11/14 Python
施华洛世奇日本官网:SWAROVSKI日本
2018/05/04 全球购物
个人自我鉴定范文
2013/10/04 职场文书
应聘医药销售自荐书范文
2014/02/08 职场文书
材料工程专业毕业生求职信
2014/03/04 职场文书
学生自我评语大全
2014/04/18 职场文书
劳动竞赛口号
2014/06/16 职场文书
投资公司董事长岗位职责
2015/04/16 职场文书
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python
Tomcat用户管理的优化配置详解
2022/03/31 Servers