美文网首页
PHP设计模式

PHP设计模式

作者: taobao | 来源:发表于2021-07-17 08:47 被阅读0次

单例模式

  • $_instance 必须申明为静态的是有变量
  • 构造函数和析构函数必须申明为私有,防止外部程序new类从而失去单例模式的意义
  • getInstance() 方法必须设置为共有的,必须调用此方法,以返回实例的一个引用
  • 私有的__clone()方法防止克隆对象
<?php
class SingletonMode
{
    //静态化 私有 变量
    private static $_instance;

    //私有化 构造函数
    private function __construct()
    {

    }

    //私有化 析构函数
    private function __destruct()
    {
        // TODO: Implement __destruct() method.
    }

    //私有化 克隆函数
    private function __clone()
    {
        // TODO: Implement __clone() method.
    }

    // 静态 公共 方法
    public static function create()
    {
        if (!self::$_instance) {
            self::$_instance = new  self();
        }
        return self::$_instance;
    }
}

工厂模式

工厂模式,工厂方法或者类生成对象,而不是在代码中直接new
使用工厂模式,可以避免当改变某个类的名字或者方法后,在调用这个类的所有的代码中都修改它的名字或者参数

<?php

/**
 * Class Mode3
 */
class Mode3 {
    public function __construct()
    {
        echo "I'm Model 3!!!\r\n";
    }
}

/**
 * Class ModelY
 */
class ModelY {
    public function __construct()
    {
        echo "I'm Model Y!!!\r\n";
    }
}

/**
 * Class Factory
 */
class Factory
{
    /**
     * @return Mode3
     */
    public function createMode3()
    {
        return new Mode3();
    }

    /**
     * @return ModelY
     */
    public function createModeY()
    {
        return new ModelY();
    }
}

注册模式

注册模式,解决全局共享和交换对象,已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可,将对象注册到全局的数组上,任何地方可以直接去访问

<?php

/**
 * Class Register
 */
class Register
{
    /**
     * @var 全局数组
     */
    protected static $arr;

    /**
     * @desc 设定对象
     * @param $key
     * @param $obj
     */
    public static function set($key, $obj)
    {
        self::$arr[$key] = $obj;
    }

    /**
     * @desc 获取对象
     * @param $key
     * @return mixed
     */
    public static function get($key)
    {
        return self::$arr[$key];
    }

    /**
     * @desc 删除对象
     * @param $key
     */
    public static function remove($key)
    {
        unset(self::$arr[$key]);
    }
}

适配器模式

描述:将各种不同的函数接口封装成统一的API
场景:PHP的数据库连接方式有多种MySQL、MySQLI、PDO,可以用适配器统一,适用不同的数据库操作,封装成一个统一的API,类似场景还有cache适配器,可以将memache、redis、file、apc等不同的缓存,统一成一致的
实现方式:首先定义一个借口,然后有几种不同的情况,就写几个类实现借口,

<?php

interface Db
{
    function connect();
    function query();
}

class Adapter implements Db
{
    private $adapter;

    public function __construct($obj)
    {
        $this->adapter = $obj;
    }

    public function connect()
    {
        $this->adapter->connect();
    }

    public function query()
    {
        $this->adapter->query();
    }
}

class MySQL_mysql implements Db
{
    protected $conn;

    public function connect()
    {
        echo "I'm MySQL connect!!!\r\n";
    }

    public function query()
    {
        echo "I'm MySQL query!!!\r\n";
    }
}

class MySQL_mysqli implements Db
{
    protected $conn;

    public function connect()
    {
        echo "I'm MySQLi connect!!!\r\n";
    }

    public function query()
    {
        echo "I'm MySQLi query!!!\r\n";
    }
}

class MySQL_pdo implements Db
{
    protected $conn;

    public function connect()
    {
        echo "I'm MySQL_PDO connect!!!\r\n";
    }

    public function query()
    {
        echo "I'm MySQL_PDO query!!!\r\n";
    }
}

$a = new MySQL_mysql();
$b = new MySQL_mysqli();
$c = new MySQL_pdo();

$adapter = new Adapter($a);
$adapter->connect();
$adapter->query();

$adapter = new Adapter($b);
$adapter->connect();
$adapter->query();

$adapter = new Adapter($c);
$adapter->connect();
$adapter->query();

策略模式

策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境
使用场景:电商网站根据用户类型,推荐展示不同的类目、商品信息

<?php

interface UserStrategy
{
    function showCate();
    function showInfo();
}

class MaleUser implements UserStrategy
{
    public function showCate()
    {
        echo "show male cate!!!\r\n";
    }

    public function showInfo()
    {
        echo "show male info!!!\r\n";
    }
}

class FemalUser implements UserStrategy
{
    public function showCate()
    {
        echo "show female cate!!!\r\n";
    }

    public function showInfo()
    {
        echo "show female info!!!\r\n";
    }
}

class Page
{
    public $strategy;

    public function setStrategy($obj)
    {
        $this->strategy = $obj;
    }

    public function show()
    {
        $this->strategy->showCate();
        $this->strategy->showInfo();
    }
}

$page = new Page();

$type = 'male';
if ($type == 'male') {
    $strategy = new MaleUser();
} else if ($type == 'femal') {
    $strategy = new FemalUser();
}
$page->setStrategy($strategy);
$page->show();

观察者模式

描述:当一个对象状态发生变化时,依赖它的对象全部收到通知,并自动更新
场景:一个事件发生后,要执行一连串更新操作,传统的编程方式,就是在时间得代码之后直接加入处理的逻辑,当更新的逻辑增多之后,代码会变的难以维护,这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码,观察者模式实现了低耦合,非侵入式的通知和更新机制。

<?php

/**
 * @desc 观察者
 * Class Observer
 */

interface Observer
{
    function update();
}

class Event
{
    private $observers = [];

    public function addObserver(Observer $observer)
    {
        $this->observers[] = $observer;
    }

    public function notify()
    {
        foreach ($this->observers as $observer) {
            $observer->update();
        }
    }

    public function trigger()
    {
        echo "Event trigger!!!\r\n";
    }
}

class Observer1 implements Observer
{
    public function update()
    {
        echo "observer1 update\r\n";
    }
}

class Observer2 implements Observer
{
    public function update()
    {
        echo "observer2 update\r\n";
    }
}

$event = new Event();
$event->addObserver(new Observer1());
$event->addObserver(new Observer2());
$event->trigger();
$event->notify();

控制反转

层层的依赖关系,反转到调用的起点。通过调整注入的对象,来控制程序的行为

 <?php

//传统依赖写法
class A {
    public function action()
    {
        echo "class A\r\n";
    }
}

class B {
    public function action()
    {
        $a = new A();
        $a->action();
    }
}

class C {
    public function action()
    {
        $b = new B();
        $b->action();
    }
}

//传统依赖写法
$c = new C();
$c->action();

//控制反转模式
class NewA {

    public function action()
    {
        echo "class newA\r\n";
    }

}

class NewB {

    public $obj;

    public function __construct(NewA $a)
    {
        $this->obj = $a;
    }

    public function action() {
        echo "class newB\r\n";
        $this->obj->action();
    }
}

class NewC {

    public $obj;

    public function __construct(NewB $b)
    {
        $this->obj = $b;
    }

    public function action()
    {
        echo "class newC\r\n";
        $this->obj->action();
    }
}

$obj = new NewC(new NewB(new NewA()));
$obj->action();

装饰器

描述:装饰器模式,可以动态地添加修改类的功能

<?php

/**
 * 装饰器接口
 * Interface Decorator
 */
interface Decorator
{
    public function before();

    public function after();
}


class Color implements Decorator
{
    public function before()
    {
        echo "Color before\r\n";
    }

    public function after()
    {
        echo "Color after\r\n";
    }
}

class Size implements Decorator
{
    public function before()
    {
        echo "Size before\r\n";
    }

    public function after()
    {
        echo "Size after\r\n";
    }
}

class Show
{
    public $decorator = [];

    public function addDecorator(Decorator $decorator)
    {
        $this->decorator[] = $decorator;
    }

    public function before()
    {
        foreach ($this->decorator as $item) {
            $item->before();
        }
    }

    public function after()
    {
        foreach ($this->decorator as $item) {
            $item->after();
        }
    }

    public function index()
    {
        //before
        $this->before();

        //核心处理
        echo "Show index\r\n";

        //after
        $this->after();
    }
}

$show = new Show();
$show->addDecorator(new Color());
$show->addDecorator(new Size());
$show->index();

可参考资源:
https://zhuanlan.zhihu.com/p/191592277

相关文章

网友评论

      本文标题:PHP设计模式

      本文链接:https://www.haomeiwen.com/subject/pemvpltx.html