<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                #### 觀察者模式 在此種模式中,一個目標對象管理所有相依于它的觀察者對象,并且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實時事件處理系統。觀察者模式又叫做發布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監聽器(Source/Listener)模式或從屬者(Dependents)模式。 `角色` Subject: 抽象目標類,一般至少提供三個接口: * 添附(Attach):新增觀察者到串煉內,以追蹤目標對象的變化。 * 解附(Detach):將已經存在的觀察者從串煉中移除。 * 通知(Notify):利用觀察者所提供的更新函式來通知此目標已經產生變化。 ConcreteSubject: 具體目標,提供了觀察者欲追蹤的狀態,也可設置目標狀態 Observer: 抽象觀察者,定義觀察者的更新操作接口 ConcreteObserver: 具體觀察者,實現抽象觀察者的接口,做出自己的更新操作 `UML類圖` ![此處輸入圖片的描述](https://doc.shiyanlou.com/document-uid108299labid2297timestamp1486376064027.png) `示例代碼`:`Observer.class.php` ~~~php <?php abstract class Obeserver{ abstract function update(Subject $sub); } abstract class Subject{ protected static $obeservers; function __construct() { if (!isset(self::$obeservers)) { self::$obeservers = []; } } public function attach(Obeserver $obeserver){ if (!in_array($obeserver, self::$obeservers)) { self::$obeservers[] = $obeserver; } } public function deattach(Obeserver $obeserver){ if (in_array($obeserver, self::$obeservers)) { $key = array_search($obeserver,self::$obeservers); unset(self::$obeservers[$key]); } } abstract public function setState($state); abstract public function getState(); public function notify() { foreach (self::$obeservers as $key => $value) { $value->update($this); } } } class MySubject extends Subject { protected $state; public function setState($state) { $this->state = $state; } public function getState() { return $this->state; } } class MyObeserver extends Obeserver { protected $obeserverName; function __construct($name) { $this->obeserverName = $name; } public function update(Subject $sub) { $state = $sub->getState(); echo "Update Obeserver[".$this->obeserverName.'] State: '.$state . '<br>'; } } $subject = new MySubject(); $one = new MyObeserver('one'); $two = new MyObeserver('two'); $subject->attach($one); $subject->attach($two); $subject->setState(1); $subject->notify(); echo "--------------------- <br>"; $subject->setState(2); $subject->deattach($two); $subject->notify(); ~~~ 主要作用: * 當抽象個體有兩個互相依賴的層面時。封裝這些層面在單獨的對象內將可允許程序員單獨地去變更與重復使用這些對象,而不會產生兩者之間交互的問題。 * 當其中一個對象的變更會影響其他對象,卻又不知道多少對象必須被同時變更時。 * 當對象應該有能力通知其他對象,又不應該知道其他對象的實做細節時。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看