美文网首页
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