您好,登錄后才能下訂單哦!
這篇文章主要介紹了laravel用什么設計模式,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
laravel用到的設計模式:工廠模式、單例模式、注冊樹模式、適配器模式、策略模式、數據對象映射模式、觀察者模式、原型模式、裝飾器模式、迭代器模式、代理模式等。
本教程操作環境:windows7系統、Laravel6版、Dell G3電腦。
本文給大家介紹了Laravel 中一些常用的設計模式,你一直都在用,可能你都不知道。。。
1:工廠模式
例如:Auth::user()
此處Auth
這個類就是工廠中的方法,Auth
是注冊樹中的別名。
好處:
類似于函數的封裝,使對象有一個統一的生成(實例化)入口。當我們對象所對應的類的類名發生變化的時候,我們只需要改一下工廠類類里面的實例化方法即可。
2:單例模式
好處:
對象不可外部實例化并且只能實例化一次,節省資源。
實現方式:
private static $ins = null; //設置私有的屬性 private function __construct() {} //使外部無法new這個類 public static function getIns() { //暴露給外部的調用方法 if(self::$ins instanceof self) { return self::$ins; } else { self::$ins = new self(); return self::$ins; } }
聲明一個類的私有或者保護的靜態變量,構造方法聲明為私有(不允許外部進行new操作),如果不存在則實例化它,然后返回,如果存在則直接返回。
3:注冊樹模式
使用:
config/app
里的aliases
數組便是一個注冊樹
好處:
注冊樹模式就是使用數組結構來存取對象,工廠方法只需要調用一次(可以放到系統環境初始化這樣的地方),以后需要調用該對象的時候直接從注冊樹上面取出來即可,不需要再調用工廠方法和單例模式。
實現方法:
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::$onjects[$alias]); } }
$alias
表示別名,自己設定
在工廠模式中添加
Register::set(‘db1’,$db);
其他任何地方調用只需要調用注冊器讀取即可
Register::$objects[‘db1’];
4:適配器模式
將不同工具的不同函數接口封裝成統一的API,方便調用。如:mysql
,mysqli
,PDO
。
實現:在接口類里面申明統一的方法體,再讓不同的類去實現這個接口,和重寫其抽象方法。
interface Database { function connect($host,$user,$password,$dbname); function query($sql); function close(); }
然后再去用不同的工具函數去實現相同的接口。
5:策略模式
好處:
將一組特定的行為和算法封裝成類,以適應某些特定的上下文環境,將邏輯判斷和具體實現分離,實現了硬編碼到解耦,并可實現IOC、依賴倒置、反轉控制。
實現:
1.定義一個策略接口文件(UserStrategy.php
),定義策略接口,聲明策略
2.定義具體類(FemaleUserStrategy.php
,MaleUserStrategy.php
),實現策略接口,重寫策略方法
class Page { protected $strategy; function index() { if($request->get('female')) { $strategy=new FemaleUserStrategy(); } else { $strategy=new MaleUserStrategy(); } $this->strategy->method(); } public function __construct(UserStrategy $strategy) { $this->strategy=$strategy; } }
6:數據對象映射模式
好處:將對象和數據存儲映射起來,對一個對象的操作會映射為對數據存儲的操作,這也是ORM的實現機制。
class Model { public $id; public $name; public $email; …… function __construct($id) { //構造函數,調用class時自動執行,用來初始化。 //查詢邏輯 } function __destruct() { //析構函數,當class調用完成后自動執行,用它來銷毀實例,釋放資源。 //增刪改邏輯 } }
7:觀察者模式
使用:
觸發類Event
<?php namespace App\Events; abstract class Event { //邏輯代碼 }
監聽類EventListener
<?php namespace App\Listeners; use App\Events\SomeEvent; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; class EventListener { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param SomeEvent $event * @return void */ public function handle(SomeEvent $event) { // } }
好處:
當一個對象狀態發生改變時,依賴它的對象全部會收到通知并自動更新,實現低耦合,非侵入式的通知與更新機制。
8:原型模式
與工廠模式類似,用于創建對象,不同在于:原型模式是先創建好一個原型對象,再通過clone原型對象來創建新的對象,原型模式適用于大對象的創建,僅需要內存拷貝即可。
$Object = new Object(); $object_1 = clone $Object; $object_2 = clone $Object;
9:裝飾器模式
若要修改或添加一個類的功能,傳統的方式是寫一個子類繼承它,并重新實現類的方法。裝飾器模式僅需在運行時添加一個裝飾器對象即可動態的添加或修改類的功能。
傳統方法:
class Method2 extends Method { function doSomething() { echo "<div style='color:red'>" parent::doSomething(); echo "</div>"; } } interfa Decorator { //定義裝飾器接口 function beforeAction(); function afterAction(); //more decoratorMethod…… } class SomeClass { protected $decorators = []; function addDecorator(Decorator $decorator) { $this->decorators[] = $decorator; } function beforeMethod() { foreach ($this->decorators as $row) { $row->beforeAction(); } } function afterMethod() { $decorators = array_reverse($this->decorators); //做一個反轉 foreach ($this->decorators as $row) { $row->afterAction(); } } function action() { $this->beforeMethod(); //method; $this->afterMethod(); } } class OneDecorator implements Decorator { protected $datas; function __construct($datas = 'request') { $this->datas = $datas; } function beforeAction() { echo "<div style='color:{$this->datas};'>"; } function afterAction() { echo "</div>"; } } $Object = new \SomeClass(); $Object->addDecorator(new \OneDecorator('blue')); //Add other decorator... $Object->action();
10:迭代器模式
在不需要了解內部實現的前提下,遍歷一個聚合對象的內部元素,相對于傳統編程方式它可以遍歷元素所需的操作。
例如:
Object::all() Iterator extends Traversable { //PHP內置迭代器接口 /* 方法 */ abstract public mixed current (void) abstract public scalar key (void) abstract public void next (void) abstract public void rewind (void) abstract public boolean valid (void) } class ObjectAll implements \Iterator { protected $ids; //所有對象的id protected $index; //迭代器的當前位置 protected $data = array(); //保存從數據庫取到的所有對象 function __construct() { //取出所有的id,$ids } function current() { //獲取當前的元素的數據,第三個調用 $id = $this->ids[$this->index]['id']; return Object::find($id); } function next() { //獲取下一個元素,第四個調用 $this->index ++; } function valid() { //驗證當前元素是否還有下一個元素(查詢當前是否有數據),第二個調用 return $this->index < count($this->$ids); } function rewind() { //當迭代器執行到末尾時,重置迭代器到整個集合的開頭,最先調用 $this->index = 0; } function key() { //獲取當前的索引,最后調用 return $this->index; } } $objects = new \ObjectAll(); foreach ($objects as $row) { dump($row->field); //增刪改查操作 }
11:代理模式
在客戶端與實體之間建立一個代理對象,客戶端對實體進行操作全部委派給代理對象,隱藏實體的具體實現細節(slave
讀庫與master
寫庫分離)。代理對象還可以與業務代碼分離,部署到另外的服務器,業務代碼中通過PRC
來委派任務。
interface DBproxy { function getInfo($id); function setInfo($id, $value); } class Proxy implements DBproxy { function get() { //DB::('slave'); query } function set() { //DB::('master'); query } } $proxy = new Proxy(); $proxy->get($id); $proxy->set($id, $value);
感謝你能夠認真閱讀完這篇文章,希望小編分享的“laravel用什么設計模式”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。