前の記事「PHP のアダプター パターンを理解する」では、PHP のアダプター パターンについて紹介しましたが、この記事では、PHP のオブザーバー パターンについて説明します。
#観察者、このキャラクターは多くの SF 作品に登場するようです。たとえば、私のお気に入りのアメリカのテレビ シリーズの 1 つである「フリンジ」では、観察者が常に時間と空間を移動して、さまざまな人物や物体を記録します。ただし、デザインパターンにおける観察者はただ傍観しているのではなく、対象の状態変化に応じて対応する行動をとります。
GoF 定義: オブジェクト間の 1 対多の依存関係を定義します。変更が発生すると、それに依存するすべてのオブジェクトが通知され、自動的に更新されます。
#GoF クラス図:
#コードの実装
interface Observer { public function update(Subject $subject): void; }オブザーバーの抽象インターフェイスについては特に言うことはありません。特定の Update
class ConcreteObserver implements Observer { private $observerState = ''; function update(Subject $subject): void { $this->observerState = $subject->getState(); echo '执行观察者操作!当前状态:' . $this->observerState; } }を実装できるだけです。特定のオブザーバーupdate() メソッドを実装します。ここで、Subject クラスを取得します。これにより、ステータスを取得できます。
class Subject { private $observers = []; private $stateNow = ''; public function attach(Observer $observer): void { array_push($this->observers, $observer); } public function detach(Observer $observer): void { $position = 0; foreach ($this->observers as $ob) { if ($ob == $observer) { array_splice($this->observers, ($position), 1); } ++$position; } } public function notify(): void { foreach ($this->observers as $ob) { $ob->update($this); } } }Subject 親クラスは、オブザーバー配列を維持し、これを追加、削除、ループします。配列メソッドのメソッドは、すべてのオブザーバーを簡単に管理するためのものです。
class ConcreteSubject extends Subject{ public function setState($state) { $this->stateNow = $state; $this->notify(); } public function getState() { return $this->stateNow; } }Subject の実装クラスはステータスを更新するだけです。ステータスが変化すると、オブザーバー トラバーサル メソッドが呼び出され、すべてのオブザーバーが更新されます。()Operation
##例
今回は注文から始めますが、テキスト メッセージの送信がまだ残っています。一般的な電子商取引プラットフォームで誰かが注文すると、在庫を変更したり、テキスト メッセージやプッシュ通知を送信して販売者に誰かが注文したことを伝えたり、購入者にその旨を伝えたりするなど、多くの作業を行う必要があります。注文は正常に行われ、支払いも正常に完了しました。つまり、一つの出来事が起こると、様々な出来事が起こるのです。実際、これは、別の非常に有名なモデルSubscribe および Publishingおよびモデルにつながります。このモードはオブザーバーのアップグレード モードと言えます。この一連の記事では詳細には触れませんが、
パブリッシュとサブスクライブ
受注販売クラスの図
完全なソース コード: https://github.com/zhangyue0503/designpatterns- php/blob/master/06.observer/source/order-observer.phpinterface Observer
{
public function update($obj);
}
class Message implements Observer
{
//....
function update($obj)
{
echo '发送新订单短信(' . $obj->mobile . ')通知给商家!';
}
//....
}
class Goods implements Observer
{
//....
public function update($obj)
{
echo '修改商品' . $obj->goodsId . '的库存!';
}
//....
}
class Order
{
private $observers = [];
public function attach($ob)
{
$this->observers[] = $ob;
}
public function detach($ob)
{
$position = 0;
foreach ($this->observers as $ob) {
if ($ob == $observer) {
array_splice($this->observers, ($position), 1);
}
++$position;
}
}
public function notify($obj)
{
foreach ($this->observers as $ob) {
$ob->update($obj);
}
}
public function sale()
{
// 商品卖掉了
// ....
$obj = new stdClass();
$obj->mobile = '13888888888';
$obj->goodsId = 'Order11111111';
$this->notify($obj);
}
}
$message = new Message();
$goods = new Goods();
$order = new Order();
$order->attach($message);
$order->attach($goods);
// 订单卖出了!!
$order->sale();
SPL 拡張機能はオブザーバー パターンを実装します - 完全なソース コード: https://github.com/zhangyue0503/designpatterns-php/blob/master/06.observer/source/spl_observer.php
この記事は、https://juejin.cn/post/6844903930262978574
著者: ハードコア プロジェクト マネージャー
推奨学習から転載されました。 : "PHP ビデオ チュートリアル "
以上がPHP におけるオブザーバー パターンの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。