ホームページ  >  記事  >  PHPフレームワーク  >  laravelはどのようなデザインパターンを使用していますか?

laravelはどのようなデザインパターンを使用していますか?

青灯夜游
青灯夜游オリジナル
2021-09-17 12:26:165933ブラウズ

laravel で使用されるデザイン パターン: ファクトリ モード、シングルトン モード、登録ツリー モード、アダプター モード、ストラテジー モード、データ オブジェクト マッピング モード、オブザーバー モード、プロトタイプ モード、デコレーター モード、イテレーター モード、エージェント モードなど。

laravelはどのようなデザインパターンを使用していますか?

このチュートリアルの動作環境:Windows 7 System、Laravel 6バージョン、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;

        }

}

クラスのプライベートまたは保護された静的変数を宣言し、コンストラクターをプライベートとして宣言し (外部の新しい操作は許可されません)、存在しない場合はインスタンス化します。存在する場合は、Return します。存在する場合は、直接戻ります。

3: 登録ツリー モード

使用:

config/app#エイリアス## の配列は登録ツリーです

利点:

登録ツリー モードでは、配列構造を使用してオブジェクトとファクトリにアクセスします。このメソッドは一度呼び出すだけで済みます(システム環境の初期化などの場所に置くことができます) 今後オブジェクトを呼び出す必要がある場合は、登録ツリーから直接取り出すことができます。ファクトリ メソッドまたはシングルトン モードを呼び出します。

実装方法:

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 はエイリアスを表し、自分で設定します

Add

をファクトリーに追加しますmode

Register::set('db1',$db);

その他のプレース呼び出しでは、read のためにレジスタを呼び出すだけで済みます

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.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

<pre class="brush:js;toolbar:false;">&lt;?php namespace App\Events; abstract class Event { //逻辑代码 }</pre> Listening クラス

EventListener

<pre class="brush:php;toolbar:false;">&lt;?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>利点:

オブジェクトのステータスが変化すると、それに依存するすべてのオブジェクトが通知を受け取り、自動的に更新され、Low が実装されます。結合、非侵入的な通知および更新メカニズム。

8: プロトタイプ パターン # はファクトリ パターンに似ており、オブジェクトの作成に使用されます。違いは、プロトタイプ パターンが最初にあることです。プロトタイプ オブジェクトを作成します。その後、プロトタイプ オブジェクトのクローンを作成して新しいオブジェクトを作成します。プロトタイプ モードは、大きなオブジェクトの作成に適しており、メモリのコピーのみが必要です。

$Object = new Object();
$object_1 = clone $Object;
$object_2 = clone $Object;

9: デコレータ パターンクラスの機能を変更または追加するには、従来の方法は、それを継承するサブクラスを作成することです。 、クラスメソッドを再実装します。デコレータ パターンでは、実行時にデコレータ オブジェクトを追加するだけで、クラスの機能を動的に追加または変更できます。

従来の方法:

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视频教程

以上がlaravelはどのようなデザインパターンを使用していますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。