您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“PHP常用六大設計模式是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“PHP常用六大設計模式是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
三私一公:私有的靜態變量(存放實例),私有的構造方法(防止創建實例),私有的克隆方法(防止克隆對象),公有的靜態方法(對外界提供實例)
程序應用中,涉及到數據庫操作時,如果每次操作的時候連接數據庫,會帶來大量的資源消耗。可以通過單例模式,創建唯一的數據庫連接對象。
<?phpclass Singleton{ private static $_instance; private function __construct(){} private function __clone(){} public static function getInstance() { if(self::$_instance instanceof Singleton){//instanceof 判斷一個實例是否是某個類的對象 self::$_instance = new Singleton(); } return self::$_instance; }}
將調用對象與創建對象分離,調用者直接向工廠請求,減少代碼的耦合.提高系統的可維護性與可擴展性。
提供一種類,具有為您創建對象的某些方法,這樣就可以使用工廠類創建對象,而不直接使用new。這樣如果想更改創建的對象類型,只需更改該工廠即可。
//假設3個待實例化的類class Aclass{}class Bclass{}class Cclass{}class Factory{ //定義每個類的類名 const ACLASS = 'Aclass'; const BCLASS = 'Bclass'; const CCLASS = 'Cclass'; public static function getInstance($newclass) { $class = $newclass;//真實項目中這里常常是用來解析路由,加載文件。 return new $class; }}//調用方法:Factory::getInstance(Factory::ACLASS);
注冊樹模式通過將對象實例注冊到一棵全局的對象樹上,需要的時候從對象樹上采摘的模式設計方法。
不管你是通過單例模式還是工廠模式還是二者結合生成的對象,都統統給我“插到”注冊樹上。我用某個對象的時候,直接從注冊樹上取一下就好。這和我們使用全局變量一樣的方便實用。而且注冊樹模式還為其他模式提供了一種非常好的想法。 (如下實例是單例,工廠,注冊樹的聯合使用)
//創建單例class Single{ public $hash; static protected $ins=null; final protected function __construct(){ $this->hash=rand(1,9999); } static public function getInstance(){ if (self::$ins instanceof self) { return self::$ins; } self::$ins=new self(); return self::$ins; }}//工廠模式class RandFactory{ public static function factory(){ return Single::getInstance(); }}//注冊樹class Register{ protected static $objects; public static function set($alias,$object){ self::$objects[$alias]=$object; } public static function get($alias){ return self::$objects[$alias]; } public static function _unset($alias){ unset(self::$objects[$alias]); }}//調用Register::set('rand',RandFactory::factory());$object=Register::get('rand');print_r($object);
定義一系列算法,將每一個算法封裝起來,并讓它們可以相互替換。策略模式讓算法獨立于使用它的客戶而變化。
策略模式提供了管理相關的算法族的辦法; 策略模式提供了可以替換繼承關系的辦法;使用策略模式可以避免使用多重條件轉移語句。
多個類只區別在表現行為不同,可以使用Strategy模式,在運行時動態選擇具體要執行的行為。比如上學,有多種策略:走路,公交,地鐵…
abstract class Strategy{ abstract function goSchool();}class Run extends Strategy{ public function goSchool() { // TODO: Implement goSchool() method. }}class Subway extends Strategy{ public function goSchool() { // TODO: Implement goSchool() method. }}class Bike extends Strategy{ public function goSchool() { // TODO: Implement goSchool() method. }}class Context{ protected $_stratege;//存儲傳過來的策略對象 public function goSchoole() { $this->_stratege->goSchoole(); }}//調用:$contenx = new Context();$avil_stratery = new Subway();$contenx->goSchoole($avil_stratery);
將各種截然不同的函數接口封裝成統一的API。
PHP中的數據庫操作有MySQL,MySQLi,PDO三種,可以用適配器模式統一成一致,使不同的數據庫操作,統一成一樣的API。類似的場景還有cache適配器,可以將memcache,redis,file,apc等不同的緩存函數,統一成一致。
abstract class Toy{ public abstract function openMouth(); public abstract function closeMouth();}class Dog extends Toy{ public function openMouth() { echo "Dog open Mouth\n"; } public function closeMouth() { echo "Dog close Mouth\n"; }}class Cat extends Toy{ public function openMouth() { echo "Cat open Mouth\n"; } public function closeMouth() { echo "Cat close Mouth\n"; }}//目標角色(紅)interface RedTarget{ public function doMouthOpen(); public function doMouthClose();}//目標角色(綠)interface GreenTarget{ public function operateMouth($type = 0);}//類適配器角色(紅)class RedAdapter implements RedTarget{ private $adaptee; function __construct(Toy $adaptee) { $this->adaptee = $adaptee; } //委派調用Adaptee的sampleMethod1方法 public function doMouthOpen() { $this->adaptee->openMouth(); } public function doMouthClose() { $this->adaptee->closeMouth(); }}//類適配器角色(綠)class GreenAdapter implements GreenTarget{ private $adaptee; function __construct(Toy $adaptee) { $this->adaptee = $adaptee; } //委派調用Adaptee:GreenTarget的operateMouth方法 public function operateMouth($type = 0) { if ($type) { $this->adaptee->openMouth(); } else { $this->adaptee->closeMouth(); } }}class testDriver{ public function run() { //實例化一只狗玩具 $adaptee_dog = new Dog(); echo "給狗套上紅棗適配器\n"; $adapter_red = new RedAdapter($adaptee_dog); //張嘴 $adapter_red->doMouthOpen(); //閉嘴 $adapter_red->doMouthClose(); echo "給狗套上綠棗適配器\n"; $adapter_green = new GreenAdapter($adaptee_dog); //張嘴 $adapter_green->operateMouth(1); //閉嘴 $adapter_green->operateMouth(0); }}//調用$test = new testDriver();$test->run();
觀察者模式(Observer),當一個對象狀態發生變化時,依賴它的對象全部會收到通知,并自動更新。觀察者模式實現了低耦合,非侵入式的通知與更新機制。
一個事件發生后,要執行一連串更新操作。傳統的編程方式,就是在事件的代碼之后直接加入處理的邏輯。當更新的邏輯增多之后,代碼會變得難以維護。這種方式是耦合的,侵入式的,增加新的邏輯需要修改事件的主體代碼。
// 主題接口interface Subject{ public function register(Observer $observer); public function notify();}// 觀察者接口interface Observer{ public function watch();}// 主題class Action implements Subject{ public $_observers=[]; public function register(Observer $observer){ $this->_observers[]=$observer; } public function notify(){ foreach ($this->_observers as $observer) { $observer->watch(); } }}// 觀察者class Cat1 implements Observer{ public function watch(){ echo "Cat1 watches TV<hr/>"; }} class Dog1 implements Observer{ public function watch(){ echo "Dog1 watches TV<hr/>"; } } class People implements Observer{ public function watch(){ echo "People watches TV<hr/>"; } }// 調用實例$action=new Action();$action->register(new Cat1());$action->register(new People());$action->register(new Dog1());$action->notify();
讀到這里,這篇“PHP常用六大設計模式是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。