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]);
}
}
表示別名,自己設定在工廠模式中加入
其他任何地方呼叫只需要呼叫註冊器讀取即可
4:適配器模式將不同工具的不同函數介面封裝成統一的API,方便呼叫。如:
mysql,mysqli
,PDO
。 實作:在介面類別裡面申明統一的方法體,再讓不同的類別去實作這個接口,和重寫其抽象方法。
interface Database { function connect($host,$user,$password,$dbname); function query($sql); function close(); }
然後再去用不同的工具函數去實作相同的介面。
5:策略模式好處:
將一組特定的行為和演算法封裝成類,以適應某些特定的上下文環境,將邏輯判斷和具體實現分離,實現了硬編碼到解耦,並可實現IOC、依賴倒置、反轉控制。
實作:
1.定義一個策略介面檔案(
UserStrategy.php),定義策略接口,宣告策略2.定義具體類(
,MaleUserStrategy.php
#),實作策略接口,重寫策略方法<pre class="brush:php;toolbar:false">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;
}
}</pre>
6:資料物件對應模式好處:將物件和資料儲存映射起來,對一個物件的操作會映射為資料儲存的操作,這也是ORM的實作機制。
class Model { public $id; public $name; public $email; …… function __construct($id) { //构造函数,调用class时自动执行,用来初始化。 //查询逻辑 } function __destruct() { //析构函数,当class调用完成后自动执行,用它来销毁实例,释放资源。 //增删改逻辑 } }
7:觀察者模式#使用:
觸發類別
Event# <pre class="brush:js;toolbar:false;"><?php
namespace App\Events;
abstract class Event
{
//逻辑代码
}</pre>
監聽類別
<pre class="brush:php;toolbar:false;"><?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)
{
//
}
}</pre>
好處:
當一個物件狀態改變時,依賴它的物件全部會收到通知並自動更新,實現低耦合,非侵入式的通知與更新機制。
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视频教程
以上是laravel用到哪些設計模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!