ホームページ  >  記事  >  バックエンド開発  >  PHP オブザーバー パターンの簡単な例

PHP オブザーバー パターンの簡単な例

WBOY
WBOYオリジナル
2016-07-25 08:52:061016ブラウズ
  1. //監視された抽象クラス
  2. class 監視された実装 SplSubject{
  3. protected $_name;
  4. protected $_observers;
  5. //インスタンス化、オブザーバー オブジェクトを生成
  6. public function __construct(){
  7. $this-> ;_observers = new SplObjectStorage();
  8. }
  9. //オブザーバー オブジェクトを追加
  10. public functionattach(SplObserver $observer){
  11. $this->_observers->attach($observer);
  12. }
  13. //オブザーバー オブジェクトを削除
  14. public function detach (SplObserver $observer){
  15. $this->_observers->detach($observer);
  16. }
  17. //通知メッセージ
  18. public function Notice(){
  19. foreach($this-> _observers as $observer){
  20. $observer->showMessage($this);
  21. }
  22. }
  23. //通常のメソッド: 値を設定します
  24. public function setName($name){
  25. $this->_name = $name;
  26. $this-> Notice();
  27. }
  28. //通常のメソッド: 値を取得
  29. public function getName(){
  30. return $this->_name;
  31. }
  32. //通常のメソッド: 年齢を設定
  33. public function setAge ($age){
  34. $this->age = $age;
  35. foreach($this->_observers as $observer){
  36. $observer->showAge($this->_name,$this-> age);
  37. }
  38. }
  39. }
  40. //オブザーバー抽象クラス
  41. class オブザーバー実装 SplObserver{
  42. //メッセージプロンプトを表示
  43. public function showMessage(SplSubject $obj){
  44. $user = $obj->getName() ;
  45. if($user= =='admin'){
  46. echo 'こんにちは、',$user,'管理背景へようこそ
    ';
  47. }else{
  48. echo "こんにちは、' $user' あなたはユーザーに追加されましたlist
    ";
  49. }
  50. }
  51. //親クラスから継承した抽象メソッドです
  52. public function update(SplSubject $subject) {}
  53. //個人の年齢を表示します
  54. public function showAge($name, $age){
  55. echo "<script>alert('$name's age is: $age')</script>";
  56. }
  57. }
  58. $subject = new Observed( ) // 観測オブジェクトを生成します
  59. ; $observer = new Observer(); //オブザーバーオブジェクトを生成します
  60. $subject->attach($observer);//オブザーバーを監視対象に渡します
  61. $subject->setName('Zhang San'); // setName メソッドを呼び出す
  62. /*
  63. * $this->notify();
  64. * を呼び出すことで $this->notify () を呼び出すことで、$observer->showMessage($this) メソッドが呼び出されます
  65. *は、各オブザーバー オブジェクトの showMessage($obj) メソッドです;
  66. */
  67. $subject->setName('admin');
  68. $subject->setAge(24);
コードをコピー

例2、オブザーバーモード:

    インターフェース Subject
  1. {
  2. public function Attach($Observer); // オブザーバーを追加します
  3. public function Detach($Observer) // オブザーバーをキックアウトします
  4. public function Notify();条件
  5. public function SubjectState($Subject); // 観察条件
  6. }
  7. class Boss が Subject を実装する
  8. {
  9. private $_Observer;
  10. public function Attach($Observer); - >_Observer[] = $Observer;
  11. }
  12. パブリック関数 Detach($Observer)
  13. {
  14. $ObserverKey = array_search($Observer, $this->_Observer)
  15. if($ObserverKey !== false)
  16. {
  17. unset($this->_Observer[$ObserverKey]);
  18. }
  19. }
  20. パブリック関数 Notify()
  21. {
  22. foreach($this->_Observer as $value)
  23. {
  24. $value->Update ( );
  25. }
  26. }
  27. public function SubjectState($Subject)
  28. {
  29. $this->_action = $Subject;
  30. }
  31. abstract クラス Observer
  32. {
  33. protected $_Subject; Name,$Sub)
  34. {
  35. $this->_UserName = $Name;
  36. $this->_Sub = $Sub;
  37. public abstract function Update(); //メソッドを受信します
  38. } / /bbs. it-home.org
  39. クラス StockObserver はオブザーバーを拡張します
  40. {
  41. public function __construct($name,$sub)
  42. {
  43. parent::__construct($name,$sub)
  44. }
  45. public function Update()
  46. {
  47. echo; $this->_Sub->_action.$this->_UserName." 早く逃げてください...
  48. }
  49. }
  50. $huhansan = new Boss() //監視対象者
  51. $ gongshil = new StockObserver( "三毛",$huhansan); //オブザーバーを初期化します
  52. $huhansan->Attach($gongshil); //オブザーバーを追加します
  53. $huhansan->Attach($gongshil); //同じオブザーバーを追加します
  54. $huhansan->Detach($gongshil); //基地内の監視員を追い出す
  55. $huhansan->SubjectState("警察が来る") //満たされた条件を満たす
  56. $huhansan-> Notify(); //すべての有効なオブザーバーを通じてコード
  57. をコピーします
  58. 手順: Observable コンテナのインターフェイスを継承するクラス (Observable と呼びます) このインターフェースのメソッドには、オブザーバーの追加、オブザーバーのキックアウト、オブザーバーのリマインド、および観察条件が含まれます。 オブザーバーを追加することは、このコンテナーにいくつかのクラスを登録することと同じです。もちろん、これらのクラスには、監視された情報に応答するメソッドが必要であるという前提があります。 監視されたコンテナは、コンテナ内のすべての登録された監視者に対応するかどうかを通知する必要があるかどうかを決定するために、さまざまな監視条件パラメータを受け入れます。 リマインダー条件が満たされると、コンテナ内のすべてのオブザーバーに、対応するメソッドを呼び出し、対応するオブザーバー インスタンスへの変更を実装することがリマインドされます。



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