ホームページ バックエンド開発 PHPチュートリアル PHPオブザーバーパターンの詳しい説明

PHPオブザーバーパターンの詳しい説明

Jun 05, 2018 pm 05:13 PM
php オブザーバーパターン デザインパターン

この記事では主に PHP オブザーバーモードの詳細な説明を紹介します。興味のある方はぜひ参考にしてください。

1. インテント
オブジェクト間の 1 対多の依存関係を定義します。オブジェクトの状態が変化すると、それに依存するすべてのオブジェクトが通知され、自動的に更新されます [GOF95]
これをパブリッシュと呼びます。 -Subscribe(Publish-Subscribe)モード、Model-View(モデルビュー)モード、ソース-リスナー(Source-Listener)モード、またはDependents(依存関係)モード
2. オブザーバーパターン構造図

3. オブザーバー パターンの主な役割 抽象サブジェクト (Subject) ロール: サブジェクト ロールは、オブザーバー オブジェクトへのすべての参照をコレクションに保存します。各サブジェクトは任意の数のオブザーバーを持つことができます。抽象テーマは、オブザーバー オブジェクトを追加および削除するためのインターフェイスを提供します。
抽象オブザーバー (オブザーバー) の役割: すべての特定のオブザーバーのインターフェイスを定義し、観察の対象が変更されたときに自身を更新します。
具体的なサブジェクト (ConcreteSubject) の役割: 特定のオブザーバー オブジェクトへのストレージ関連の状態 特定のサブジェクトの内部状態が変化すると、登録されているすべてのオブザーバーに通知が送信されます。具体的なテーマの役割は、通常、具体的なサブクラスを使用して実装されます。
具象オブザーバー (ConcretedObserver) ロール: 特定のサブジェクト オブジェクトを保存し、関連する状態を保存し、抽象オブザーバー ロールが独自の状態をサブジェクトの状態と一致させるために必要な更新インターフェイスを実装します。
4. オブザーバー パターンの利点と欠点: 1 オブザーバーとサブジェクト間の結合が小さい。 オブザーバー パターンの欠点:
1。オブザーバーは他のオブザーバーの存在を知らないため、ターゲットを変更する最終的なコストがわからない可能性があります。これにより、予期しない更新が発生する可能性があります。
5. オブザーバーパターンの適用可能なシナリオ
1. 抽象モデルに 2 つの側面があり、一方が他方に依存する場合。 2. 1 つのオブジェクトを変更するときに他のオブジェクトも同時に変更する必要がある場合、いくつのオブジェクトを変更する必要があるかはわかりません。
3. オブジェクトが他のオブジェクトに通知する必要がある場合、他のオブジェクトが誰であるかを想定することはできません。言い換えれば、これらのオブジェクトが密結合されることは望ましくありません。 6. オブザーバー パターンとその他のパタ​​ーン

メディエーター パターン (メディエーター):
複雑な更新セマンティクスをカプセル化することにより、ChangeManager はターゲットとオブザーバーの間のメディエーターとして機能します。 シングルトン モード (シングルトン モード): ChangeManager はシングルトン モードを使用して、一意でグローバルにアクセスできることを保証できます。 7. オブザーバーモードの PHP サンプル

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

<?php

/**

 * 抽象主题角色

 */

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

   */

  private $_name;

  

  public function __construct($name) {

    $this->_name = $name;

  }

  

  /**

   * 更新方法

   */

  public function update() {

    echo 'Observer', $this->_name, ' has notified.<br />';

  }

  

}

  

/**

 * 客户端

 */

class Client {

  

  /**

   * Main program.

   */

  public static function main() {

    $subject = new ConcreteSubject();

  

    /* 添加第一个观察者 */

    $observer1 = new ConcreteObserver('Martin');

    $subject->attach($observer1);

  

    echo '<br /> The First notify:<br />';

    $subject->notifyObservers();

  

    /* 添加第二个观察者 */

    $observer2 = new ConcreteObserver('phppan');

    $subject->attach($observer2);

  

    echo '<br /> The Second notify:<br />';

    $subject->notifyObservers();

  

    /* 删除第一个观察者 */

    $subject->detach($observer1);

  

    echo '<br /> The Third notify:<br />';

    $subject->notifyObservers();

  }

  

}

  

Client::main();

?>

ログイン後にコピー

概要: 上記がこの記事の全内容です。皆さんの学習に役立つことを願っています。 関連する推奨事項:

PHP でユーザー名、携帯電話、電子メールを非表示にするアスタリスクを実装する方法

php WeChat パブリック プラットフォーム構成インターフェイス開発プログラムの詳細な方法の例

PHP 実装 前の記事 次の記事 詳細方法の説明

以上がPHPオブザーバーパターンの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

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

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド

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

CakePHP の日付と時刻

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

CakePHP プロジェクトの構成

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

CakePHP ファイルのアップロード

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

CakePHP ルーティング

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

CakePHP について話し合う

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP クイックガイド

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

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法

See all articles