91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP成長記(一) —— 設計模式

發布時間:2020-07-02 07:43:08 來源:網絡 閱讀:676 作者:村長愛技術 欄目:web開發

   “為什么需求又變了”,“又得重構了”,“代碼太亂了,不能復用啊”,“咦,這段代碼以前在哪寫過啊,怎么還得寫一遍呢”…… 是改變的時候了,如果你不想做一個默默無聞并且每天累的要死的碼農,那就趕緊學習設計模式吧,他會讓你站在另一個高度看問題,讓你成為大家的仰慕者,也會讓團隊沉淀出很多復用的東西,既然設計模式好處這么多,那么我就給大家講一下常用的設計模式吧。

       所謂設計模式,就是解決特定問題的方案,很多問題前人已經解決過N次了,已經形成了很好的解決方案,我們可以學習并應用之。

       1、單例模式

<?php
    /**
     * 策略模式,當類中實現了多種實現方式的時候,最好把這些方式
     * 提取出來放到自己的類型中,而不是通過繼承去支持這些實現,
     * 下面的例子是一個計算方式是加10,一個是加20,這樣無論有多少
     * 中算法都可以無限擴展,問題也可以無線擴展,這樣不會有代碼冗余
     */
    abstract class Question{
        protected $marker;
        public function __construct(Marker $marker) {
            $this->marker = $marker;
        }
        public function mark($param) {
            return $this->marker->mark($param);
        }
    }
    class Add extends Question{
        //其他方法
    }
    abstract class Marker{
        abstract function mark($param);
    }
    class Marker10 extends Marker{
        function mark($param) {
            return $param + 10;
        }
    }
    class Marker20 extends Marker{
        function mark($param) {
            return $param + 20;
        }
    }
                                                                                                                                                                                                                                                                                   
    $add = new Add(new Marker10());
    echo $add->mark(10);//20
    $add = new Add(new Marker20());
    echo $add->mark(10);//30

   2、工廠模式

<?php
    /**
     * 工廠模式,工廠模式分為工廠方法模式和抽象工廠模式
     * 工廠方法模式就是類Factory和Pen,他們下面都有對應
     * 的子類,可以"橫向"擴展,抽象工廠模式就是兩個類聯合起來,
     * 比如Book類調用了Pencil類,Notebook類調用了ColourPen,實現
     * 了"縱向"擴展
     */
    abstract class Factory{
        public function index() {
            echo 'html';
        }
        abstract public function getPen();
    }
    class Book extends Factory{
        public function getPen() {
            return new Pencil();
        }
    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
    class Notebook extends Factory{
        public function getPen(){
            return new ColourPen();
        }
    }
    abstract class Pen{
    }
    class Pencil extends Pen{
    }
    class ColourPen extends Pen{
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
    }


   3、原型模式

<?php
    /**
     * 原型模式,原型模式類似抽象工廠模式
     */
    class Book{
        private $pen;
        public function __construct(Pen $pen) {
            $this->pen = $pen;
        }
        public function getPen() {
            return clone $this->pen;
        }
    }
    abstract class Pen{}
    class Pencil extends Pen{}
    class ColourPen extends Pen{}

   4、組合模式

<?php
    /**
     * 組合模式,可以把任何形式組合起來
     */
    abstract class Group{
        private $groups = array();
        public function add(Group $group) {
            $this->groups[] = $group;
        }
        public function remove(Group $group) {
            $this->groups = array_diff(array($group),$this->groups);
        }
        public function money() {
            $count = 0;
            foreach ($this->groups as $group) {
                $count += $group->money();
            }
            return $count;
        }
    }
    class Buy extends Group{
    }
    class Pen extends Group{
        public function money() {
            return 10;
        }
    }
    class Book extends Group{
        public function money() {
            return 12;
        }
    }
    $buy = new Buy();
    $buy->add(new Pen());
    $buy->add(new Book());
    //聲明一個新的Buy對象
    $buy2 = new Buy();
    //把$buy添加進來
    $buy2->add($buy);
    $buy2->add(new Book());
    echo $buy2->money(); //34


5、裝飾模式

<?php
    /**
     * 策略模式,和組合模式很相似,下面的舉例
     * 比如工資是100,吃用了10,房子花了90,最后只剩下0
     */
    abstract class Money{
        abstract function cost();
    }
    class Salary extends Money{
        private $salary = 100;
        public function cost() {
            return $this->salary;
        }
    }
    abstract class Life extends Money{
        protected $salary;
        function __construct(Money $money) {
            $this->salary = $money;
        }
    }
    class Eat extends Life{
        public function cost() {
            return $this->salary->cost() - 10;
        }
    }
    class House extends Life{
        public function cost() {
            return $this->salary->cost() - 90;
        }
    }
    //首先是發工資(new Salary),然后是吃(new Eat),然后是房子(new House)
    $salary = new House(new Eat(new Salary()));
    echo $salary->cost(); //0

6、策略模式

<?php
    /**
     * 策略模式,當類中實現了多種實現方式的時候,最好把這些方式
     * 提取出來放到自己的類型中,而不是通過繼承去支持這些實現,
     * 下面的例子是一個計算方式是加10,一個是加20,這樣無論有多少
     * 中算法都可以無限擴展,問題也可以無線擴展,這樣不會有代碼冗余
     */
    abstract class Question{
        protected $marker;
        public function __construct(Marker $marker) {
            $this->marker = $marker;
        }
        public function mark($param) {
            return $this->marker->mark($param);
        }
    }
    class Add extends Question{
        //其他方法
    }
    abstract class Marker{
        abstract function mark($param);
    }
    class Marker10 extends Marker{
        function mark($param) {
            return $param + 10;
        }
    }
    class Marker20 extends Marker{
        function mark($param) {
            return $param + 20;
        }
    }
                                                                                                                                                                                                                                                                                                                                                      
    $add = new Add(new Marker10());
    echo $add->mark(10);//20
    $add = new Add(new Marker20());
    echo $add->mark(10);//30

   7、觀察者模式,可以自由組合要處理的觀察者

<?php
    /**
     * 被觀察者接口
     */
    interface Observable{
        /* 添加觀察者 */
        function attach(Observer $observer);
        /* 刪除觀察者 */
        function detach(Observer $observer);
        /* 通知觀察者操作 */
        function notify();
    }
    /**
     * 登錄被觀察者
     */
    class Login implements Observable{
        private $status;
        private $observers = array();
        /* 登錄 */
        function post() {
            //登錄是否成功
            $this->status = mt_rand(0,1);
            //通知觀察者
            $this->notify();
        }
        function getStatus() {
            return $this->status;
        }
        /* 添加觀察者 */
        function attach(Observer $observer) {
            $this->observers[] = $observer;
        }
        /* 刪除觀察者 */
        function detach(Observer $observer) {
            $newObservers = array();
            foreach ($this->observers as $key => $value) {
                if($observer !== $value) {
                    $newObservers[] = $value;
                }
            }
            $this->observers = $newObservers;
        }
        /* 通知觀察者 */
        function notify() {
            if($this->observers) {
                foreach ($this->observers as $observer) {
                    $observer->update($this);
                }
            }
        }
    }
    /**
     * 觀察者抽象類
     */
    abstract class Observer{
        function __construct(Observable $observable) {
            $observable->attach($this);
        }
        abstract function update(Observable $observable);
    }
    /**
     * 設置登錄成功就寫日志
     */
    class Log extends Observer{
        function update(Observable $observable) {
            if($observable->getStatus() == 1) {
                echo 'write log';
            }
        }
    }
    /**
     * 設置登錄失敗就發送email
     */
    class Email extends Observer{
        function update(Observable $observable) {
            if($observable->getStatus() == 0) {
                echo 'Send Email';
            }
        }
    }
    $login = new Login();
    //可以自由組合登錄狀態的操作
    new Log($login);
    new Email($login);
    //登錄
    $login->post();

   

   總結:這里的設計模式不是全部,只是拋磚引玉。設計模式的原則是“組合優于繼承,繼承優于多臺”,當然這里是相對來說的,還需要具體問題具體分析,還有我們什么時候該考慮設計呢——從一開始,沒錯,寫代碼之前就要開始設計,在寫代碼過程中,如果遇到“代碼重復”、“類知道的太多”、“萬能的類”、“條件語句”的問題,就要考慮要不要設計一下了。




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

寿光市| 余姚市| 六盘水市| 曲沃县| 肇源县| 镇赉县| 侯马市| 平罗县| 西林县| 巴彦淖尔市| 古蔺县| 泗阳县| 泸水县| 兴和县| 永川市| 三河市| 博白县| 遂宁市| 大埔区| 洮南市| 梁河县| 渭源县| 吕梁市| 伊春市| 图们市| 石狮市| 宜春市| 望江县| 安徽省| 遂昌县| 原平市| 怀仁县| 华亭县| 临沭县| 澜沧| 冷水江市| 卢湾区| 苗栗县| 天长市| 米林县| 天镇县|