<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                前言 介紹16個常用的設計模式的基礎概念和技術要點,通過UML類圖幫助理解設計模式中各個類之間的關聯關系,針對每種設計模式都使用PHP完成了一個代碼示例,讓你跟隨實例輕松入門設計模式。 提示:以下是本篇文章正文內容,下面案例可供參考 # 一、設計模式 1.單例模式 單例模式解決的是如何在整個項目中創建唯一對象實例的問題 代碼如下(示例): ``` <?php class Singleton { private static $instance; //私有構造方法,禁止使用new創建對象 private function __construct(){} public static function getInstance(){ if (!isset(self::$instance)) { self::$instance = new self; } return self::$instance; } //將克隆方法設為私有,禁止克隆對象 private function __clone(){} public function say() { echo "這是用單例模式創建對象實例 <br>"; } public function operation() { echo "這里可以添加其他方法和操作 <br>"; } } // $shiyanlou = new Singleton(); $shiyanlou = Singleton::getInstance(); $shiyanlou->say(); $shiyanlou->operation(); $newShiyanlou = Singleton::getInstance(); var_dump($shiyanlou === $newShiyanlou); ``` # 2.工廠模式 工廠模式解決的是如何不通過new建立實例對象的方法。 代碼如下(示例): ``` <?php interface TV{ public function open(); public function use(); } class HaierTv implements TV { public function open() { echo "Open Haier TV <br>"; } public function use() { echo "I'm watching TV <br>"; } } interface PC{ public function work(); public function play(); } class LenovoPc implements PC { public function work() { echo "I'm working on a Lenovo computer <br>"; } public function play() { echo "Lenovo computers can be used to play games <br>"; } } abstract class Factory{ abstract public static function createPc(); abstract public static function createTv(); } class ProductFactory extends Factory { public static function createTV() { return new HaierTv(); } public static function createPc() { return new LenovoPc(); } } $newTv = ProductFactory::createTV(); $newTv->open(); $newTv->use(); $newPc = ProductFactory::createPc(); $newPc->work(); $newPc->play(); ``` # 3.策略模式 針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,例如進入個人主頁時,根據瀏覽者的不同,給予不同的顯示與操作 代碼如下(示例): ``` <?php /* * 聲明策略文件的接口,約定策略包含的行為。 */ interface UserStrategy { function showAd(); function showCategory(); } class FemaleUser implements UserStrategy { function showAd(){ echo "2016冬季女裝"; } function showCategory(){ echo "女裝"; } } class MaleUser implements UserStrategy { function showAd(){ echo "IPhone6s"; } function showCategory(){ echo "電子產品"; } } ``` # 4.適配器模式 將各種截然不同的函數接口封裝成統一的API。 PHP中的數據庫操作有MySQL,MySQLi,PDO三種,可以用適配器模式統一成一致,使不同的數據庫操作,統一成一樣的API。 類似的場景還有cache適配器,可以將memcache,redis,file,apc等不同的緩存函數,統一成一致。 首先定義一個接口(有幾個方法,以及相應的參數)。然后,有幾種不同的情況,就寫幾個類實現該接口。將完成相似功能的函數,統一成一致的方法。 代碼如下(示例): ``` interface IDatabase { function connect($host, $user, $passwd, $dbname); 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); } } ``` #MySQLi ``` 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); } } ``` #PDO ``` class PDO implements IDatabase { protected $conn; function connect($host, $user, $passwd, $dbname) { $conn = new \PDO("mysql:host=$host;dbname=$dbname", $user, $passwd); $this->conn = $conn; } function query($sql) { return $this->conn->query($sql); } function close() { unset($this->conn); } } ``` # 5.注冊模式 注冊模式,解決全局共享和交換對象。已經創建好的對象,掛在到某個全局可以使用的數組上,在需要使用的時候,直接從該數組上獲取即可。將對象注冊到全局的樹上。任何地方直接去訪問。 代碼如下(示例): ``` <?php class Register { protected static $objects; function set($alias,$object)//將對象注冊到全局的樹上 { self::$objects[$alias]=$object;//將對象放到樹上 } static function get($name){ return self::$objects[$name];//獲取某個注冊到樹上的對象 } function _unset($alias) { unset(self::$objects[$alias]);//移除某個注冊到樹上的對象。 } } ``` # 6.觀察者模式 1:觀察者模式(Observer),當一個對象狀態發生變化時,依賴它的對象全部會收到通知,并自動更新。 2:場景:一個事件發生后,要執行一連串更新操作。傳統的編程方式,就是在事件的代碼之后直接加入處理的邏輯。當更新的邏輯增多之后,代碼會變得難以維護。這種方式是耦合的,侵入式的,增加新的邏輯需要修改事件的主體代碼。 代碼如下(示例): ``` <?php interface Observer { public function update($obj); } class Message implements Observer { //.... function update($obj) { echo '發送新訂單短信(' . $obj->mobile . ')通知給商家!'; } //.... } class Goods implements Observer { //.... public function update($obj) { echo '修改商品' . $obj->goodsId . '的庫存!'; } //.... } class Order { private $observers = []; public function attach($ob) { $this->observers[] = $ob; } public function detach($ob) { $position = 0; foreach ($this->observers as $ob) { if ($ob == $observer) { array_splice($this->observers, ($position), 1); } ++$position; } } public function notify($obj) { foreach ($this->observers as $ob) { $ob->update($obj); } } public function sale() { // 商品賣掉了 // .... $obj = new stdClass(); $obj->mobile = '13888888888'; $obj->goodsId = 'Order11111111'; $this->notify($obj); } } $message = new Message(); $goods = new Goods(); $order = new Order(); $order->attach($message); $order->attach($goods); // 訂單賣出了!! $order->sale(); ``` 總結
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看