深入分析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 删除cookie和浏览器重定向
Mar 16 PHP
谨慎使用PHP的引用原因分析
Sep 06 PHP
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
Jul 03 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
Jul 15 PHP
thinkphp的c方法使用示例
Feb 24 PHP
CodeIgniter中实现泛域名解析
Jul 19 PHP
php获取URL中带#号等特殊符号参数的解决方法
Sep 02 PHP
十幅图告诉你什么是PHP引用
Feb 22 PHP
PHP添加图片水印、压缩、剪切的封装类
Aug 17 PHP
使用php+swoole对client数据实时更新(一)
Jan 07 PHP
php表单加入Token防止重复提交的方法分析
Oct 10 PHP
PHP工厂模式的日常使用
Mar 20 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 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
php中curl、fsocket、file_get_content三个函数的使用比较
2014/05/09 PHP
php数组遍历类与用法示例
2019/05/24 PHP
通过百度地图获取公交线路的站点坐标的js代码
2012/05/11 Javascript
alert中断settimeout计时功能
2013/07/26 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
2014/04/02 Javascript
javascript字符串与数组转换汇总
2015/05/26 Javascript
利用Angularjs实现幻灯片效果
2016/09/07 Javascript
利用js定义一个导航条菜单
2017/03/14 Javascript
JS实现仿饿了么在浏览器标签页失去焦点时网页Title改变
2017/06/01 Javascript
js设计模式之代理模式及订阅发布模式实例详解
2019/08/15 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
[01:07:19]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第一场 1月19日
2021/03/11 DOTA
答题辅助python代码实现
2018/01/16 Python
Python从零开始创建区块链
2018/03/06 Python
详解python websocket获取实时数据的几种常见链接方式
2019/07/01 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
2019/09/03 Python
Python实现自动装机功能案例分析
2020/10/22 Python
详解tensorflow之过拟合问题实战
2020/11/01 Python
POP文化和音乐灵感的时尚:Hot Topic
2019/06/19 全球购物
Spotahome意大利:公寓和房间出租
2020/02/21 全球购物
Linux内核的同步机制是什么?主要有哪几种内核锁
2013/01/03 面试题
工程力学专业毕业生求职信
2013/10/06 职场文书
客服专员岗位职责范本
2013/11/29 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书
奠基仪式主持词
2014/03/20 职场文书
关于孝道的演讲稿
2014/05/21 职场文书
新农村建设典型材料
2014/05/31 职场文书
工作失职检讨书500字
2014/10/17 职场文书
2015年元旦促销方案书
2014/12/09 职场文书
2014年学生资助工作总结
2014/12/18 职场文书
2015年组织委员工作总结
2015/04/23 职场文书
校园安全学习心得体会
2016/01/18 职场文书
某药房的新员工入职告知书!
2019/07/15 职场文书