策略模式
#策略模式是物件的行為模式,用意是對一組演算法的封裝。動態的選擇需要的演算法並使用。
策略模式指的是程式中涉及決策控制的一種模式。策略模式功能非常強大,因為這個設計模式本身的核心思想就是物件導向程式設計的多形性想法。
策略模式的三個角色:
1.抽象策略角色
2.具體策略角色
3.環境角色(對抽象策略角色的引用)
實作步驟:
1.定義抽象角色類別(定義好各個實作的共同抽象方法)
2.定義具體策略類別(具體實作父類別的共同方法)
3.定義環境角色類別(私有化申明抽象角色變量,重載建構方法,執行抽象方法)
就在程式設計領域之外,有許多例子是關於策略模式的。例如:
如果我需要在早晨從家裡出發去上班,我可以有幾個策略考慮:我可以搭乘地鐵,搭乘公車,走路或其它的途徑。每個策略可以得到相同的結果,但使用了不同的資源。
策略模式的程式碼實例:
<?phpabstract class baseAgent { //抽象策略类 abstract function PrintPage(); } //用于客户端是IE时调用的类(环境角色) class ieAgent extends baseAgent { function PrintPage() { return 'IE'; } } //用于客户端不是IE时调用的类(环境角色) class otherAgent extends baseAgent { function PrintPage() { return 'not IE'; } } class Browser { //具体策略角色 public function call($object) { return $object->PrintPage (); } } $bro = new Browser (); echo $bro->call ( new ieAgent () ); ?>
工廠模式
工廠模式是我們最常用的實例化物件模式,是用工廠方法取代new操作的一種模式。
使用工廠模式的好處是,如果你想要更改所實例化的類別名稱等,則只需更改該工廠方法內容即可,不需逐一尋找程式碼中具體實例化的地方(new處)修改了。為系統結構提供靈活的動態擴展機制,減少了耦合。
<?php header('Content-Type:text/html;charset=utf-8'); /** *简单工厂模式(静态工厂方法模式) */ /** * Interface people 人类 */ interface people { public function say(); } /** * Class man 继承people的男人类 */ class man implements people { // 具体实现people的say方法 public function say() { echo '我是男人<br>'; } } /** * Class women 继承people的女人类 */ class women implements people { // 具体实现people的say方法 public function say() { echo '我是女人<br>'; } } /** * Class SimpleFactoty 工厂类 */ class SimpleFactoty { // 简单工厂里的静态方法-用于创建男人对象 static function createMan() { return new man(); } // 简单工厂里的静态方法-用于创建女人对象 static function createWomen() { return new women(); } } /** * 具体调用 */ $man = SimpleFactoty::createMan(); $man->say(); $woman = SimpleFactoty::createWomen(); $woman->say();
單例模式
單例模式確保某個類別只有一個實例,並且自行實例化並向整個系統提供這個實例。
單例模式是一種常見的設計模式,在電腦系統中,執行緒池、快取、日誌物件、對話方塊、印表機、資料庫操作、顯示卡的驅動程式常被設計成單例。
單例模式分為3種:懶漢式單例、餓漢式單例、登記式單例。
單例模式有以下3個特點:
1.只能有一個實例。
2.必須自行建立這個實例。
3.必須給其他物件提供這一實例。
那為什麼要使用PHP單例模式?
PHP一個主要應用場合就是應用程式與資料庫打交道的場景,在一個應用程式中會存在大量的資料庫操作,針對資料庫句柄連接資料庫的行為,使用單例模式可以避免大量的new操作。因為每一次new操作都會消耗系統和記憶體的資源。
class Single { private $name;//声明一个私有的实例变量 private function __construct(){//声明私有构造方法为了防止外部代码使用new来创建对象。 } static public $instance;//声明一个静态变量(保存在类中唯一的一个实例) static public function getinstance(){//声明一个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();//good morning echo $ob->getname();//good morning
註冊模式
註冊模式,解決全域共用和交換物件。已經創建好的對象,掛在到某個全域可以使用的數組上,在需要使用的時候,直接從該數組上獲取即可。將物件註冊到全域的樹上。任何地方直接去訪問。
<?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]);//移除某个注册到树上的对象。 } }
適配器模式
將各種截然不同的函數介面封裝成統一的API。
PHP中的資料庫操作有MySQL,MySQLi,PDO三種,可以用適配器模式統一成一致,讓不同的資料庫操作,統一成相同的API。類似的場景還有cache適配器,可以將memcache,redis,file,apc等不同的快取函數,統一成一致。
先定義一個介面(有幾個方法,以及對應的參數)。然後,有幾種不同的情況,就寫幾個類別實作該介面。將完成相似功能的函數,統一成一致的方法。
#接口 IDatabase <?php namespace IMooc; interface IDatabase { function connect($host, $user, $passwd, $dbname); function query($sql); function close(); }
MySQL
<?php namespace IMooc\Database; use IMooc\IDatabase; 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
<?php namespace IMooc\Database; use IMooc\IDatabase; 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:觀察者模式( Observer),當一個物件狀態改變時,依賴它的物件全部會收到通知,並自動更新。
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();
相關推薦:PHP教學
#以上是詳解五種常見的PHP設計模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!