<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之旅 廣告
                [TOC] ## :-: 基本的設計模式 1. 工廠模式 說明:工廠方法或者類生成對象,而不是在代碼中直接new 2. 單例模式 說明:使某個類的對象僅允許創建一個 代碼: ~~~ class Database { private static $db; private function __construct()//把構造方法定義為私有的,這樣在類外就不能通過new關鍵字來實例化一個類 { } static function getInstance() { if (self::$db) { return self::$db; } else { self::$db = new self(); return self::$db; } } } ~~~ 3. 注冊模式 說明:全局共享和交換對象 代碼: ~~~ class register { private static $objects; static function set($alias, $object)//把對象掛到注冊樹上 { self::$objects[$alias] = $object; } static function get($name)//獲得注冊樹上的對象 { return self::$objects[$name]; } function _unset($alias)//把對象從注冊數上移除 { unset(self::$objects[$alias]); } } ~~~ 4. 適配器模式 說明:可以將截然不同的函數接口封裝成統一的API 實際應用舉例:PHP的數據庫操作有mysql,mysqli,pdo3種,可以用適配器模式統一成一致。類似的場景還有cache適配器,將memcache,redis,file,apc等不同的緩存函數,統一成一致的 代碼: ~~~ 首先:通過實現接口可以實現封裝成統一的API 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. 策略模式 說明:將一組特定的行為和算法封裝成類,以適應某些特定的上下文環境,這種模式就是策略模式。 實際應用舉例:假如一個電商網站系統,針對男性女性用戶要各自跳轉到不同的商品類目,并且所有的廣告位展示不同的廣告。 作用:使用策略模式可以實現Ioc,依賴倒置,控制反轉 代碼: ~~~ interface UserStrategy { function showAd(); function showCategory(); } class MaleUserStrategy implements UserStrategy { function showAd() { echo '2019男裝'; } function showCategory() { echo '男裝'; } } ~~~ 6. 數據對象映射模式 說明:是將對象和數據存儲映射起來,對一個對象的操作會映射為對數據存儲的操作。也就是對對象的操作會映射為數據庫中的一條記錄 實際應用舉例:在代碼中實現數據對象映射模式,我們將實現一個ORM類,將復雜的SQL語句映射成對象屬性的操作。 代碼: ~~~ $user = new User2(1); $user->name = 'test'; $user->mobile = ''; $user->regtime = date('Y-m-d H:i:s'); class User { public $id; public $name; public $mobile; public $regtime; protected $db; function __construct($id) { $this->db = new MySQLi(); $this->db->connect('127.0.0.1','root','123','test'); $res = $this->db->query("select * from user where id='{$id}' limit 1"); $data = $res->fetch_assoc(); $this->id = $data['id']; $this->name = $data['name']; $this->mobile = $data['mobile']; $this->regtime = $data['regtime']; } function __destruct() { $this->db->query("update user set name = '{$this->name}', mobile = '{$this->mobile}',regtime = '{$this->regtime}' where id = '{$this->id}' limit 1"); } } 7. 觀察者模式 說明:當一個對象狀態發生改變的時,依賴它的對象全部會收到通知,并自動更新 場景:一個事件發生后,要執行一連串更新操作。傳統的編程方式,就是在事件的代碼之后直接加入處理的邏輯。當更新的邏輯增多之后,代碼會變得難以維護。這種方式是耦合的,侵入式的,增加新的邏輯需要修改事件主體的代碼。 作用:觀察者模式實現了低耦合,非侵入式的通知與更新機制。 代碼: ~~~ abstract class EventGenerator//事件發生者(發生事件) { private $observers = array(); function addObserver(Observer $observer)//添加觀察者 { $this->observers[] = $observer; } function notify()//通知觀察者 { foreach ($this->observers as $observer) { $observer->update(); } } } interface Observer//觀察者,觀察的對象就是剛才的事件發生者 { function update($event_info = null);// } class Event extends EventGenerator//事件,繼承事件發生者 { function trigger() { echo '事件發生<br>/n'; $this->notify();//通知觀察者 } } $event = new Event(); $event->addObserver(new Observer1); $event->addObserver(new Observer2); $event->trigger(); ~~~ 8. 原型模式 說明:與工廠模式作用類似,都是用來創建對象。與工廠模式的實現不同,原型模式是先創建好一個原型對象,然后通過clone原型對象來創建新的對象。這樣就免去了類創建時重復的初始化操作。原型對象適用于大對象的創建。創建一個大對象需要很大的開銷,如果每次new就會消耗很大,原型模式僅需要內存拷貝即可。 9. 裝飾器模式 說明:可以動態的添加修改類的功能。 作用:一個類提供了一項功能,如果要在修改并添加額外的功能,傳統的編程方式,需要寫一個子類繼承它,并重新實現類的方法。使用裝飾器模式,僅需要運行時添加一個裝飾器對象即可實現,可以實現最大的靈活性。 10. 迭代器模式 說明:在不需要了解內部實現的前提下,遍歷一個聚合對象的內部元素。相比于傳統的編程模式,迭代器模式可以隱藏遍歷元素的所需要的操作。 11. 代理模式 說明:在客戶端與實體之間建立一個代理對象(proxy),客戶端對實體進行操作全部委派給代理對象,隱藏實現的具體實現細節。Proxy還可以與業務代碼分離,部署到另外的服務器。業務代碼中通過RPC來委派任務。
                  <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>

                              哎呀哎呀视频在线观看