深入分析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编写的导航条程序
Oct 09 PHP
利用 window_onload 实现select默认选择
Oct 09 PHP
PHP 编程请选择正确的文本编辑软件
Dec 21 PHP
简单的方法让你的后台登录更加安全(php中加session验证)
Aug 22 PHP
PHP提示Notice: Undefined variable的解决办法
Nov 24 PHP
基于Zookeeper的使用详解
May 02 PHP
is_uploaded_file函数引发的不能上传文件问题
Oct 29 PHP
ThinkPHP添加更新标签的方法
Dec 05 PHP
PHP、Java des加密解密实例
Apr 27 PHP
如何在HTML 中嵌入 PHP 代码
May 13 PHP
PHP使用缓存即时输出内容(output buffering)的方法
Aug 03 PHP
浅谈Laravel队列实现原理解决问题记录
Aug 19 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 图片上添加透明度渐变的效果
2009/06/29 PHP
写出高质量的PHP程序
2012/02/04 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
php字符串的替换,分割和连接方法
2016/05/23 PHP
Yii框架实现对数据库的CURD操作示例
2019/09/03 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
JS实现打开本地文件或文件夹
2021/03/09 Javascript
XENON基于JSON变种
2010/07/27 Javascript
Jquery多选框互相内容交换的实例代码
2013/07/04 Javascript
jQuery中的read和JavaScript中的onload函数的区别
2014/08/27 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
用JavaScript获取页面文档内容的实现代码
2016/06/10 Javascript
PHP+jquery+ajax实现分页
2016/12/09 Javascript
Angular使用ng-messages与PHP进行表单数据验证
2016/12/28 Javascript
浅谈函数调用的不同方式,以及this的指向
2017/09/17 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
python实现class对象转换成json/字典的方法
2016/03/11 Python
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
解决python3中自定义wsgi函数,make_server函数报错的问题
2017/11/21 Python
win10下python3.5.2和tensorflow安装环境搭建教程
2018/09/19 Python
对python实现合并两个排序链表的方法详解
2019/01/23 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
通过实例简单了解python yield使用方法
2020/08/06 Python
企业为何需要商业计划书
2013/12/26 职场文书
工作表扬信的范文
2014/01/10 职场文书
文化建设工作方案
2014/05/12 职场文书
计算机专业求职信
2014/06/02 职场文书
室内趣味活动方案
2014/08/24 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android
JVM钩子函数的使用场景详解
2021/08/23 Java/Android
关于 Python json中load和loads区别
2021/11/07 Python
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL
Win11软件图标固定到任务栏
2022/04/19 数码科技