zoukankan      html  css  js  c++  java
  • PHP常用的设计模式

    工厂模式

    工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。

    使用工厂模式的好处是如果你想要更改所实例化的类名等,则只需要更改该工厂方法内容即可,不需逐一寻找代码中具体实例化的地方。

    目的:为系统结构提供动态拓展机制,减少了耦合。

    <?php
    
    header('Content-Type:text/html;charset=utf-8');
    /**
     * 简单工厂模式(静态工厂模式)
     */
    /**
     * interface people
     */
    interface people
    {
        public function say();
    }
    /**
     * Class man 继承people的男人类
     */
    class man implements people
    {
        public function say()
        {
            echo "男人<br>";
        }
    }
    /**
     * Class woman 继承people的女人类
     */
    class woman implements people
    {
        public function say()
        {
            echo "女人<br>";
        }
    }
    
    /**
     * Class SimpleFactory  工厂类
     */
    class SimpleFactory
    {
        // 简单工厂里的静态方法-用于创建男人对象
        static function createMan()
        {
            return new man();
        }
        // 简单工厂里的静态方法-用于创建女人对象
        static function CreateWoman()
        {
            return new woman();
        }
    }
    
    /**
     * 具体调用
     */
    $man = SimpleFactory::createMan();
    $man->say();
    $woman = SimpleFactory::CreateWoman();
    $woman->say();

    单例模式

    单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

    单例模式是一种常见的设计模式,在计算机中,线程池,缓存,日志对象,对话框,数据库操作等常被设计成单例模式。

    单例模式有以下几个特点:

    (1)只能有一个实例

    (2)必须自行创建这个实例

    (3)必须给其他对象提供这一实例

    使用单例模式的原因:

    PHP一个主要的应用场合就是应用程序与数据库打交道的场景,在一个应用中会存在大量的数据库操作,针对数据库句柄链接数据库的行为,使用单例模式可以避免大量的new操作。因为每一次new操作都会消耗系统和内存的资源。

    class single
    {
        private $name;  // 声明一个私有的实例变量
        private function __construct()  // 声明私有构造方法 为了防止外部代码使用new来创建对象
        {
        }
        static public $instance; // 声明一个静态变量(保证类中唯一的一个实例)
        static public function getinstance()  // 声明一个静态方法,用于检测是否有实例对象
        {
            if(!self::$instance) self::$instance = new self();
            return self::$instance; 
        }
        public function setname($n)
        {
            $this->name = $n;
        }
        public function getname()
        {
            return $this->name;
        }
    }
    
    $oa = Single::getinstance();
    $ob = Single::getinstance();
    $oa->setname('hello world');
    $ob->setname('good morning');
    echo $oa->getname();
    echo $ob->getname();

    注册模式

    注册模式,解决全局共享和交换对象。已经创建好的对象,挂在某个全局可以直接使用的数组上,在需要使用的时候,直接在该数组上获取即可。

    class Register
    {
        projected static $objects;
        function set($alias,$object) // 将对象注册到全局的树上
        {
            self::$objects[$alias]=$object;
        }
        static function get($name)
        {
            return self::$object[$name]; // 获得某个注册到树上的对象
        }
        function __unset($alias)
        {
            unset(self::$object[$alias]); // 移除某个注册到树上的对象
        }
    }

    适配器模式

    将各种截然不同的函数接口封装成统一的API。

    PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,是不同的数据库操作统一成一样的API。类似的场景还有cache适配器,可以将memcache,redis等不同的缓存函数,统一成一致。

    interface IDatabase
    {
        function connect($host,$user,$passwd,$dbnamne);
        function query($sql);
        function close();
    }
    
    // MySQL
    class MySQL implements IDatabase
    {
        protected $conn;
        function connect($host,$user,$passwd,$dbname)
        {
            $conn = mysql_connect($host,$user,$passwd);
            mysql_select_db($dbname,$conn);
            $this->conn = $conn;
        }
        function query($sql)
        {
            $res = mysql_query($sql,$this->conn);
            return $res;
        } 
        function close()
        {
            mysql_close($this->conn);
        }
    }
    
    class MySQLi implements IDatabase
    {
        protected $conn;
        function connect($host,$user,$passwd,$dbname)
        {
            $conn = mysqli_connect($host,$user,$passwd,$dbname);
            $this->conn = $conn;
        }
        function query($sql)
        {
            return mysqli_query($this->conn,$sql);
        }
        function close()
        {
            mysqli_close($this->conn);
        }
    }

    观察者模式

    1、观察者模式:当一个对象状态发生变化时,依赖它的对象全部会收到通知并自动更新。

    2、场景:一个事件发生后,要执行一连串更新操作。传统的编程方式就是在事件的代码之后直接加入处理的逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式时耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码。

    3、观察者模式实现了低耦合,非侵入式的通知和更新机制。

    定义一个事件触发抽象类

    EventGenerator.php
    <?php
    require_once 'Loader.php';
    abstract class EventGenerator{
        private $observers = array();
            function addObserver(Observer $observer){
            $this->observers[]=$observer;
        }
        function notify(){
            foreach ($this->observers as $observer){
                $observer->update();
            }
        }
    }
    
    
    Observer.php
    <?php
    require_once 'Loader.php';
    interface Observer{
        function update();//这里就是在事件发生后要执行的逻辑
    }
    //一个实现了EventGenerator抽象类的类,用于具体定义某个发生的事件
    
    require 'Loader.php';
    class Event extends EventGenerator{
        function triger(){
            echo "Event<br>";
        }
    }
    class Observer1 implements Observer{
        function update(){
            echo "逻辑1<br>";
        }
    }
    class Observer2 implements Observer{
        function update(){
            echo "逻辑2<br>";
        }
    }
    $event = new Event();
    $event->addObserver(new Observer1());
    $event->addObserver(new Observer2());
    $event->triger();
    $event->notify();
  • 相关阅读:
    Linux的SSH(Secure Shell Protocol)服务
    Linux开机自动挂载文件fstab介绍
    Linux之NFS网络文件系统
    深入理解sudo
    Linux定时任务(crond)
    Linux之Vim编辑器的使用
    三大文本处理工具grep、sed及awk
    jquery实现自定义弹出框
    oarcle12c打开本地数据库
    使用POI将doc文件转换为html
  • 原文地址:https://www.cnblogs.com/wawjandcsws/p/10497651.html
Copyright © 2011-2022 走看看