• PHP常用设计模式


    一、单例模式

     确保一个类只有一个实例

    特点:

    • 三私一公:私有静态属性(存放实例)、私有构造方法(防止创建实例)、私有克隆方法(防止克隆对象)、公有静态方法(对外提供实例)
    • 一个类只有一个实例
    • 必须自行创建这个实例
    • 自行像整个系统提供这个实例

    应用场景:避免大量new操作消耗资源,减少数据库连接

    <?php
    /**
      * 设计模式之单例模式
      * $_instance必须声明为静态的私有变量
      * 构造函数必须声明为私有,防止外部程序new类从而失去单例模式的意义
      * getInstance()方法必须设置为公有的,必须调用此方法以返回实例的一个引用
      * ::操作符只能访问静态变量和静态函数
      * new对象都会消耗内存
      * 使用场景:最常用的地方是数据库连接。
      * 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
      */
    class main{
        
        //保存实例在此属性中
        private static $_instance;
    
        //构造方法设置为private,防止直接创建对象
        private function __construct(){
            
        }
        
        //防止用户复制对象实例
        private function __clone(){
            trigger_error('Clone is not allow',E_USER_ERROR);
        }
        
        //单例方法
        public static function get_instance(){
            if(!isset(self::$_instance)){
                self::$_instance = new self();
            }
            return self::$_instance;
        }
        
        function test(){
            echo "test";
        }
    }
    
    //实例单例对象
    $test = main::get_instance();
    $test->test();
    ?>

    二、简单工厂模式

     特点:将调用对象和创建对象分离,调用者直接向工厂请求,减少代码耦合,提高系统的可维护性和可扩展性。

    应用场景:提供一种类,具有为你创建对象的某些方法,这样就可以使用工厂创建对象,而不是直接使用new,这样如果想更改创建对象类型直接更改工厂即可。

    <?php
    /**
     * 定义抽象类,让子类继承实现它
     */
    abstract class Operation{
        abstract function getValue($num1,$num2);
    }
    /**
     * 加法类
     */
    class OperationAdd extends Operation{
        function getValue($num1,$num2){
            return $num1+$num2;
        }
    }
    /**
     * 减法类
     */
    class OperationSub extends Operation{
        function getValue($num1,$num2){
            return $num1-$num2;
        }
    }
    /**
     * 定义工厂类,为了创建对象
     */
    class Factory{
        public static function createObj($operate){
            switch($operate){
                case '+':
                    return new OperationAdd();
                    break;
                case '-':
                    return new OperationSub();
                    break;
            }
        }
    }
    //创建对象
    $test = Factory::createObj('+');
    echo $test->getValue(1,2);
    
    ?>

    三、观察者模式

    特点:当一个对象放生变化时,依赖他的对象全部会收到通知,并自动更新,观察者模式实现了低耦合,非侵入式的通知与更新机制。

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

    <?php
    /**
     * 主题接口
     */
    interface subject{
        public function register(observer $observer);
        public function notify();
    }
    /**
     * 观察者接口
     */
    interface observer{
        public function watch();
    }
    
    /**
     * 主题
     */
    class action implements subject{
        public $_observers = [];
        function register(observer $observer){
            $this->_observers[] = $observer;
        }
        function notify(){
            foreach($this->_observers as $observer){
                $observer->watch();
            }
        }
    }
    /** 
     * 观察者
     */
    class cat implements observer{
        function watch(){
            echo "cat watches TV<br />";
        }
    }
    class dog implements observer{
        function watch(){
            echo "dog watches TV<br />";
        }
    }
    
    //调用实例
    $action = new action();
    $action->register(new cat());
    $action->register(new dog());
    $action->notify();
    
    ?>

    四、策略模式

    定义一系列算法,将每个算法封装起来,并让他们相互交替,策略模式让算法独立于使用它的客户而改变。

    特点:策略模式提供了管理相关的算法族的办法,策略模式提供了可以替换继承关系的办法,使用策略模式可以避免使用多重条件转移语句。

    应用场景:多个类之区别在行为表现不同,在运行时动态选择具体要执行的行为,比如上学,有多种策略:走路、公交、地铁

    <?php
    /**
     * 定义策略抽象类,让子类继承并实现它
     */
    abstract class Strategy{
        abstract function goSchool();
    }
    
    /**
     *实现接口
     */
    class run extends Strategy{
        function goSchool(){
            echo "走路去学校<br />";
        }
    }
    class subway extends Strategy{
        function goSchool(){
            echo "坐地铁去学校<br />";
        }
    }
    class bike extends Strategy{
        function goSchool(){
            echo "骑自行车去学校< br />";
        }
    }
    
    /**
     * 主类
     */
    class main{
        protected $_stratege;
        function goSchool($stratege){
            $this->_stratege = $stratege;
            $this->_stratege->goSchool();
        }
    }
    
    //调用
    $main = new main();
    $run = new run();
    $main->goSchool($run);
    ?>
  • 相关阅读:
    伯努利数学习笔记
    bzoj 3864: Hero meet devil(dp套dp)
    CF1137E. Train Car Selection(可删堆)
    洛谷P3779 [SDOI2017]龙与地下城(概率论+Simpson+FFT)
    洛谷P4207 [NOI2005]月下柠檬树(计算几何+自适应Simpson法)
    AtCoder Grand Contest 030题解
    Sort函数(C++)
    堆排序
    十进制--->二进制(利用C++栈功能)
    对局匹配
  • 原文地址:https://www.cnblogs.com/shier-dong/p/15324348.html
Copyright © 2020-2023  润新知