ホームページ バックエンド開発 PHPチュートリアル PHP 設計パターン Observer パターン (Observer) の詳細な紹介とコード例_PHP チュートリアル

PHP 設計パターン Observer パターン (Observer) の詳細な紹介とコード例_PHP チュートリアル

Jul 13, 2016 am 10:34 AM
php オブザーバーパターン デザインパターン

【意図】

オブジェクト間の 1 対多の依存関係を定義します。オブジェクトのステータスが変化すると、それに依存するすべてのオブジェクトが通知され、自動的に更新されます [GOF95]。パブリッシュ-サブスクライブ (パブリッシュ-サブスクライブ) パターン、モデルとも呼ばれます。 -View(Model-View)パターン、Source-Listener(Source-Listener)パターン、またはDependents(依存関係)パターン

【オブザーバーパターン構造図】

PHP 設計パターン Observer パターン (Observer) の詳細な紹介とコード例_PHP チュートリアル


【観察者モードの主役】

1. 抽象サブジェクト (Subject) ロール: サブジェクト ロールは、オブザーバー オブジェクトへのすべての参照をコレクションに保存し、各サブジェクトは好きなだけオブザーバーを持つことができます。 抽象テーマは、オブザーバー オブジェクトを追加および削除するためのインターフェイスを提供します。
2. 抽象オブザーバー (オブザーバー) の役割: すべての特定のオブザーバーのインターフェイスを定義し、観察の対象が変更されたときに自身を更新します。
3. 具象サブジェクト (ConcreteSubject) ロール: 特定のオブザーバー オブジェクトに関連する状態を保存し、特定のサブジェクトの内部状態が変化すると、登録されているすべてのオブザーバーに通知が送信されます。具体的なテーマの役割は、通常、具体的なサブクラスを使用して実装されます。
4. 具象オブザーバー ロール: 特定のサブジェクト オブジェクトを保存し、関連する状態を保存し、抽象オブザーバー ロールが自身の状態をサブジェクトの状態と一致させるために必要な更新インターフェイスを実装します。

【オブザーバーモードのメリットとデメリット】

オブザーバー パターンの利点:

1. 観察者と被験者の間の結合は小さいです
2.

オブザーバー パターンの欠点:

オブザーバーは他のオブザーバーの存在を認識していないため、ターゲットを変更するための最終的なコストがわからない可能性があります。これにより、予期しない更新が発生する可能性があります。


【オブザーバーモードの適用シナリオ】

抽象モデルに 2 つの側面がある場合、そのうちの 1 つは他方に依存します。

1 つのオブジェクトを変更するために他のオブジェクトも同時に変更する必要がある場合、変更する必要があるオブジェクトの数がわかりません。
オブジェクトが他のオブジェクトに通知する必要がある場合、他のオブジェクトが誰であるかを想定することはできません。言い換えれば、これらのオブジェクトを密結合にする必要はありません。

【オブザーバーモードとその他のモード】

1. メディエーター パターン (メディエーター): 複雑な更新セマンティクスをカプセル化することで、ChangeManager はターゲットとオブザーバーの間のメディエーターとして機能します。

2. シングルトン モード (シングルトン モード): ChangeManager はシングルトン モードを使用して、一意でグローバルにアクセスできるようにすることができます。


【オブザーバーモードのPHPサンプル】

コードをコピーします コードは次のとおりです:

/**
* 观察者模式
* @package design pattern
*/

/**
* 抽象主题角色
*/
interface Subject {

/**
* 增加一个新的观察者对象
* @param Observer $observer
*/
public function attach(Observer $observer);

/**
* 删除一个已注册过的观察者对象
* @param Observer $observer
*/
public function detach(Observer $observer);

/**
* 通知所有注册过的观察者对象
*/
public function notifyObservers();
}

/**
* 具体主题角色
*/
class ConcreteSubject implements Subject {

private $_observers;

public function __construct() {
$this->_observers = array();
    }

    /**
     * 增加一个新的观察者对象
     * @param Observer $observer
     */
    public function attach(Observer $observer) {
        return array_push($this->_observers, $observer);
    }

    /**
     * 删除一个已注册过的观察者对象
     * @param Observer $observer
     */
    public function detach(Observer $observer) {
        $index = array_search($observer, $this->_observers);
        if ($index === FALSE || ! array_key_exists($index, $this->_observers)) {
            return FALSE;
        }

        unset($this->_observers[$index]);
        return TRUE;
    }

    /**
     * 通知所有注册过的观察者对象
     */
    public function notifyObservers() {
        if (!is_array($this->_observers)) {
            return FALSE;
        }

        foreach ($this->_observers as $observer) {
            $observer->update();
        }

        return TRUE;
    }

}

/**
* 抽象观察者角色
*/
interface Observer {

    /**
     * 更新方法
     */
    public function update();
}

class ConcreteObserver implements Observer {

    /**
     * 观察者的名称
     * @var
     */
    private $_name;

    public function __construct($name) {
        $this->_name = $name;
    }

    /**
     * 更新方法
     */
    public function update() {
        echo 'Observer', $this->_name, ' has notified.
';
    }

}
实例化类:
$subject = new ConcreteSubject();

/* 添加第一个观察者 */
$observer1 = new ConcreteObserver('Martin');
$subject->attach($observer1);

echo '
The First notify:
';
$subject->notifyObservers();

/* 添加第二个观察者 */
$observer2 = new ConcreteObserver('phppan');
$subject->attach($observer2);

echo '
The Second notify:
';
$subject->notifyObservers();

/* 删除第一个观察者 */
$subject->detach($observer1);

echo '
The Third notify:
';
$subject->notifyObservers();
具体案例:

/**
* 3.1php设计模式-观测者模式
* 3.1.1概念:其实观察者模式这是一种较为容易去理解的一种模式吧,它是一种事件系统,意味
* 着这一模式允许某个类观察另一个类的状态,当被观察的类状态发生改变的时候,
* 观察类可以收到通知并且做出相应的动作;观察者模式为您提供了避免组件之间
* 紧密耦合的另一种方法
* 3.1.2关键点:
* 1.被观察者->追加观察者;->一处观察者;->满足条件时通知观察者;->观察条件
  *        2.观察者 ->接受观察方法
  * 3.1.3缺点:
  * 3.1.4观察者模式在PHP中的应用场合:在web开发中观察者应用的方面很多
  *        典型的:用户注册(验证邮件,用户信息激活),购物网站下单时邮件/短信通知等
  * 3.1.5php内部的支持
  *        SplSubject 接口,它代表着被观察的对象,
  *        其结构:
  *        interface SplSubject
  *        {
  *            public function attach(SplObserver $observer);
  *            public function detach(SplObserver $observer);
  *            public function notify();
  *        }
  *        SplObserver 接口,它代表着充当观察者的对象,
  *        其结构:
  *        interface SplObserver
  *        {  
  *            public function update(SplSubject $subject);
  *        }
  */

 /**
  * 用户登陆-诠释观察者模式
  */
class User implements SplSubject {
    //注册观察者
    public $observers = array();

    //动作类型
    CONST OBSERVER_TYPE_REGISTER = 1;//注册
    CONST OBSERVER_TYPE_EDIT = 2;//编辑

    /**
     * 追加观察者
     * @param SplObserver $observer 观察者
     * @param int $type 观察类型
     */
    public function attach(SplObserver $observer, $type)
    {
        $this->observers[$type][] = $observer;
    }

    /**
     * 去除观察者
     * @param SplObserver $observer 观察者
     * @param int $type 观察类型
     */
    public function detach(SplObserver $observer, $type)
    {
        if($idx = array_search($observer, $this->observers[$type], true))
        {
            unset($this->observers[$type][$idx]);
        }
    }

    /**
     * 满足条件时通知观察者
     * @param int $type 观察类型
     */
    public function notify($type)
    {
        if(!empty($this->observers[$type]))
        {
            foreach($this->observers[$type] as $observer)
            {
                $observer->update($this);
            }
        }
    }

/**
*/
パブリック関数 addUser()
{

//SQLを実行する
成功 // データベースは正常に挿入されました $ res = true
;
$ this->

$res を返す;

$res を返します。

/**

* ユーザー情報の編集
* @param str $username ユーザー名

* @param str $password パスワード

* @param str $email メールアドレス
*/

パブリック関数 editUser()

{

//SQLを実行する


使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用する 使用するto's to' through'''''' through''‐‐ to‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐
$これ -
$res;
$res を返します。
/**
* オブザーバーがメールを送信
*/
class Send_Mail は SplObserver を実装します

{

/**

* 対応する観測天体の情報変更

* @param SplSubject $subject
*/

public function update(SplSubject $subject)

{
$this->sendMail($subject->email) 、$title、$content);

}

/**
*メールを送信
*@param str $email メールアドレス

*@param str $title メールのタイトル

*@param str $content メールの内容
* /
public function sendemail ($ email, $ table, $ content) {
// メールインターフェイスを呼び出し、メールを送信します}}} & Gt;



http://www.bkjia.com/PHPjc/750852.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/750852.html


技術記事

[目的] オブジェクト間の 1 対多の依存関係を定義します。オブジェクトの状態が変化すると、それに依存するすべてのオブジェクトが通知され、自動的に更新されます。[GOF95] 別名...





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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

この章では、CakePHP の環境変数、一般設定、データベース設定、電子メール設定について理解します。

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

この章では、ルーティングに関連する次のトピックを学習します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

See all articles