Heim  >  Artikel  >  PHP-Framework  >  Welche Designmuster verwendet Laravel?

Welche Designmuster verwendet Laravel?

青灯夜游
青灯夜游Original
2021-09-17 12:26:165992Durchsuche

In Laravel verwendete Entwurfsmuster: Factory-Modus, Singleton-Modus, Registrierungsbaummodus, Adaptermodus, Strategiemodus, Datenobjekt-Zuordnungsmodus, Beobachtermodus, Prototypmodus, Dekoratormodus, Iteratormodus, Proxy-Modus usw.

Welche Designmuster verwendet Laravel?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, Laravel 6-Version, Dell G3-Computer.

Dieser Artikel stellt Ihnen einige häufig verwendete Designmuster in Laravel vor. Sie haben sie verwendet, kennen sie aber möglicherweise nicht. . .

1: Fabrikmuster

Zum Beispiel: Auth::user()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,方便调用。如:mysqlmysqliPDO

实现:在接口类里面申明统一的方法体,再让不同的类去实现这个接口,和重写其抽象方法。

interface Database {                                                  

        function connect($host,$user,$password,$dbname);

        function query($sql);

        function close();
    }

然后再去用不同的工具函数去实现相同的接口。

5:策略模式

好处:

将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,将逻辑判断和具体实现分离,实现了硬编码到解耦,并可实现IOC、依赖倒置、反转控制。

实现:

1.定义一个策略接口文件(UserStrategy.php),定义策略接口,声明策略

2.定义具体类(FemaleUserStrategy.phpMaleUserStrategy.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

Hier ist Auth diese Klasse die Methode in der Fabrik, Auth ist ein Alias ​​im Registrierungsbaum.

Vorteile:

Ähnlich wie bei der Funktionskapselung ermöglicht es Objekten einen einheitlichen Generierungs- (Instanziierungs-)Eingang. Wenn sich der Klassenname der unserem Objekt entsprechenden Klasse ändert, müssen wir nur die Instanziierungsmethode in der Factory-Klasse ändern.

2: Singleton-Modus

Vorteile:

Objekte können nicht extern instanziiert werden und können nur einmal instanziiert werden, wodurch Ressourcen gespart werden.

Implementierungsmethode:

<?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)
    {
        //
    }
}

Deklarieren Sie eine private oder geschützte statische Variable einer Klasse, deklarieren Sie den Konstruktor als privat (externe neue Operationen sind nicht zulässig), instanziieren Sie ihn, wenn er nicht vorhanden ist, und geben Sie ihn zurück, falls vorhanden. direkt zurückkommen. 🎜🎜🎜🎜3: Registrierungsbaummodus 🎜🎜🎜🎜🎜 Verwendung: 🎜🎜🎜 Das Array aliases in config/app ist ein Registrierungsbaum 🎜🎜🎜Vorteile: 🎜 🎜🎜Der Registrierungsbaummodus verwendet eine Array-Struktur, um auf Objekte zuzugreifen. Die Factory-Methode muss nur einmal aufgerufen werden (sie kann an einer Stelle wie der Initialisierung der Systemumgebung platziert werden). kann direkt aus dem Registrierungsbaum entnommen werden. Es ist nicht erforderlich, Factory-Methoden und Singleton-Muster aufzurufen. 🎜🎜🎜Implementierungsmethode: 🎜🎜
$Object = new Object();
$object_1 = clone $Object;
$object_2 = clone $Object;
🎜$alias stellt den Alias ​​dar, legen Sie ihn selbst fest 🎜🎜Im Werksmodus hinzufügen 🎜🎜Register::set('db1',$db); 🎜🎜Bei jedem anderen Ortsaufruf muss nur das Register zum Lesen aufgerufen werden🎜🎜Register::$objects['db1'];🎜🎜🎜🎜4: Adaptermodus🎜🎜🎜 🎜 Kapseln Sie verschiedene Funktionsschnittstellen verschiedener Tools in einer einheitlichen API für einen einfachen Aufruf. Zum Beispiel: mysql, mysqli, PDO. 🎜🎜Implementierung: Deklarieren Sie einen einheitlichen Methodenkörper in der Schnittstellenklasse und lassen Sie dann verschiedene Klassen diese Schnittstelle implementieren und ihre abstrakten Methoden neu schreiben. 🎜
class Method2 extends Method {

        function doSomething() {

                echo "<div style=&#39;color:red&#39;>"

                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 = &#39;request&#39;) {

                 $this->datas = $datas;

        }

        function beforeAction() {

                  echo "<div style=&#39;color:{$this->datas};&#39;>";

        }

        function afterAction() {

                  echo "</div>";

        }

}

$Object = new \SomeClass();

$Object->addDecorator(new \OneDecorator(&#39;blue&#39;));

//Add other decorator...

$Object->action();
🎜Dann verwenden Sie verschiedene Toolfunktionen, um dieselbe Schnittstelle zu implementieren. 🎜🎜🎜🎜5: Strategiemuster 🎜🎜🎜🎜Vorteile: 🎜🎜Kapseln Sie einen bestimmten Satz von Verhaltensweisen und Algorithmen in Klassen, um sie an bestimmte spezifische Kontexte anzupassen, logische Urteile von bestimmten Implementierungen zu trennen und harte Codierung in die Entkopplung zu implementieren und IOC zu ermöglichen , Abhängigkeitsinversion und Inversionskontrolle. 🎜🎜Implementierung:🎜🎜1. Definieren Sie eine Strategieschnittstellendatei (UserStrategy.php), definieren Sie die Strategieschnittstelle und deklarieren Sie die Strategie🎜🎜2. Definieren Sie eine bestimmte Klasse (FemaleUserStrategy.php). , MaleUserStrategy.php), implementiert die Strategieschnittstelle und überschreibt die Strategiemethode🎜
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][&#39;id&#39;];

                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);

        //增删改查操作

}
🎜🎜🎜6: Datenobjekt-Zuordnungsmodus🎜🎜🎜🎜Vorteile: Zuordnung von Objekten und Datenspeicherung, Zuordnung Eine Objektoperation wird einer Datenspeicherungsoperation zugeordnet, die auch der Implementierungsmechanismus von ORM ist. 🎜
interface DBproxy {
        function getInfo($id);
        function setInfo($id, $value);
}

class Proxy implements DBproxy {

        function get() {
                //DB::(&#39;slave&#39;);
                query

        }

        function set() {
                //DB::(&#39;master&#39;);
                query

        }

}

$proxy = new Proxy();
$proxy->get($id);
$proxy->set($id, $value);
🎜🎜🎜7: Beobachtermodus 🎜🎜🎜🎜Verwendung: 🎜🎜Trigger-Klasse Event🎜rrreee🎜Listening-Klasse EventListener🎜rrreee🎜Vorteile: 🎜🎜Be a Wann Wenn sich der Status eines Objekts ändert, erhalten alle Objekte, die darauf angewiesen sind, Benachrichtigungen und werden automatisch aktualisiert, wodurch ein kopplungsarmer, nicht aufdringlicher Benachrichtigungs- und Aktualisierungsmechanismus erreicht wird. 🎜🎜🎜🎜8: Der Prototyp-Modus 🎜🎜🎜🎜 ähnelt dem Factory-Modus und wird zum Erstellen von Objekten verwendet. Der Unterschied besteht darin, dass im Prototyp-Modus zunächst ein Prototyp-Objekt erstellt und dann ein neues Objekt erstellt wird Der Prototypenmodus eignet sich für Die Erstellung großer Objekte erfordert nur das Kopieren des Speichers. 🎜rrreee🎜🎜🎜9: Dekoratormuster 🎜🎜🎜🎜 Um die Funktionalität einer Klasse zu ändern oder hinzuzufügen, besteht die traditionelle Methode darin, eine Unterklasse zu schreiben, um sie zu erben und die Klassenmethoden erneut zu implementieren. Das Dekoratormuster muss zur Laufzeit lediglich ein Dekoratorobjekt hinzufügen, um die Funktionalität einer Klasse dynamisch hinzuzufügen oder zu ändern. 🎜🎜Traditionelle Methode:🎜
class Method2 extends Method {

        function doSomething() {

                echo "<div style=&#39;color:red&#39;>"

                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 = &#39;request&#39;) {

                 $this->datas = $datas;

        }

        function beforeAction() {

                  echo "<div style=&#39;color:{$this->datas};&#39;>";

        }

        function afterAction() {

                  echo "</div>";

        }

}

$Object = new \SomeClass();

$Object->addDecorator(new \OneDecorator(&#39;blue&#39;));

//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][&#39;id&#39;];

                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::(&#39;slave&#39;);
                query

        }

        function set() {
                //DB::(&#39;master&#39;);
                query

        }

}

$proxy = new Proxy();
$proxy->get($id);
$proxy->set($id, $value);

相关推荐:最新的五个Laravel视频教程

Das obige ist der detaillierte Inhalt vonWelche Designmuster verwendet Laravel?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Ist Laravel MVC?Nächster Artikel:Ist Laravel MVC?