本篇文章為大家帶來了關於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);
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();
// 主题接口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影片教學》
#
以上是PHP常用六大設計模式(總結分享)的詳細內容。更多資訊請關注PHP中文網其他相關文章!