隨筆-159  評(píng)論-114  文章-7  trackbacks-0

          模式是什么?

          模式是一個(gè)范式,一個(gè)在相同環(huán)境或者狀況下的一種通用解決辦法,解決方案。就好像孫子兵法,對(duì)于某種特定戰(zhàn)局,戰(zhàn)況下的一種派兵布陣策略和實(shí)施步驟的總結(jié)。

          模式需要什么呢?

          模式需要一個(gè)名字,一個(gè)問題域(要解決的問題),要有一個(gè)解決的方案,最后要達(dá)到什么樣的結(jié)果。

          長話短說,Observer模式,所要解決的問題就是,一個(gè)事物,當(dāng)它自身的狀態(tài)改變了,那么它要通知其他的事物,而它又不能夠事先知道要通知誰,只有在Runtime時(shí)才能知道。

          舉個(gè)例子吧,鐘表和人的關(guān)系就是這樣,鐘表自身的狀態(tài),也就是時(shí)刻改變了,它通知某些人,某些人看到或者聽到后,會(huì)做出不同的行為。而鐘表在商店里時(shí),并不知道要通知誰?只有買主把鐘表買回家,買主的家人注冊(cè)到這個(gè)鐘表,這時(shí),鐘表的狀態(tài)改變才會(huì)通知到家里的人,那么家人有大人、小孩,他們看到或者聽到這個(gè)鐘表的時(shí)間改變,會(huì)有不同的行為。

          那么將上面的例子可以化解為對(duì)象。鐘表是個(gè)源,它是抽象的概念,可以很多形式的表,手表、掛鐘、鬧鐘等,而家人們都是監(jiān)聽器,實(shí)現(xiàn)了監(jiān)聽器接口,監(jiān)聽器方法就是listen()和see(),當(dāng)人每個(gè)人實(shí)現(xiàn)了接口會(huì)有不同的行為,這些鐘表并不關(guān)心,它只會(huì)在整點(diǎn)時(shí)通知之前注冊(cè)到它內(nèi)部的家人實(shí)例的監(jiān)聽器方法。

          那是什么時(shí)候注冊(cè)的呢?就是主人買回家,告訴家人這是新的鐘表,也就是Timer.registerListener(Listener l)

          那么鐘表就是observable,就是那個(gè)常說的Subject,而家人就是具體的Observer,實(shí)現(xiàn)了Oberver接口的方法。

          package com.javapatterns.observer;

          public abstract class AbstractTimer {
              
              
          public void attach(){};
              
              
          public void detach(){};
              
              
          void notifyObservers(){};
          }

           

          package com.javapatterns.observer;

          import java.util.Enumeration;
          import java.util.Vector;

          public class ConcreteTimer extends AbstractTimer {

              
          private Vector observersVector = new java.util.Vector();
              
              
          public void attach(Listener observer)
              
          {
                  observersVector.addElement(observer);
              }

              
              
          public void detach(Listener observer)
              
          {
                  observersVector.removeElement(observer);
              }


              
          public void notifyObservers()
              
          {
                  Enumeration enumeration 
          = observers();
                  
          while (enumeration.hasMoreElements())
                  
          {
                      Listener l 
          = (Listener)enumeration.nextElement();
                      l.see();
                      l.hear();
                  }

              }



              
          public Enumeration observers()
              
          {
                  
          return ((Vector) observersVector.clone()).elements();
              }

              
          }

          下面是Listner接口,是一個(gè)概念模型,提供給Timer,Timer只關(guān)心,自身改變狀態(tài)后,要調(diào)用的觀察者什么行為,并不關(guān)心觀察者本身。所以提取人的若干行為,抽象成為接口。

          package com.javapatterns.observer;

          public interface Listener {
              
              
          void see();
              
              
          void hear();

          }

           

          package com.javapatterns.observer;

          public class Host implements Listener {
              
              
          private String name;
              
              
          private short age;
              
              
          private String sex;
              
              
          public Host(String name,short age,String sex){
                  
          this.name = name;
                  
          this.age = age;
                  
          this.sex = sex;        
              }


              
          public void see() {
                  
          // TODO add see default behavior

              }


              
          public void hear() {
                  
          // TODO add hear default behavior

              }

              
              
          public void otherBehavior(){
                  
              }


              
          public short getAge() {
                  
          return age;
              }


              
          public void setAge(short age) {
                  
          this.age = age;
              }


              
          public String getName() {
                  
          return name;
              }


              
          public String getSex() {
                  
          return sex;
              }


          }


          這是一個(gè)主人的類,也就是一類具體的Observer。

          output.jpg


          接口java.util.Observer和類java.util.Observable是Java本身對(duì)于觀察者模式的支持。

          其實(shí)這種模式就是一種回調(diào)的應(yīng)用,就是想其它類中注冊(cè)自己的接口,到特定時(shí)候調(diào)用自己的方法。

          就好像古詩詞中,“有朋自遠(yuǎn)方來不亦樂乎”,意思是說,如果好友光臨到門口,叫一聲自己,就會(huì)很高興,也就是說,告訴朋友到達(dá)自己住處,這個(gè)狀態(tài)滿足,那么就叫一聲自己,自己就會(huì)為朋友開門,高興等行為就會(huì)進(jìn)行。 如果不采用觀察者模式,那就是自己需要不斷的到門口察看朋友是否到了,是一種輪循的方式,當(dāng)然也能達(dá)到效果,但會(huì)影響自己的事情。



          posted on 2005-11-27 11:26 北國狼人的BloG 閱讀(443) 評(píng)論(0)  編輯  收藏 所屬分類: 達(dá)內(nèi)學(xué)習(xí)總結(jié)
          主站蜘蛛池模板: 融水| 贵定县| 博客| 元氏县| 固阳县| 理塘县| 上饶县| 安西县| 尉氏县| 潮州市| 杭锦旗| 依安县| 娱乐| 延边| 延安市| 旅游| 玛沁县| 开阳县| 牟定县| 金堂县| 防城港市| 永兴县| 荆门市| 姜堰市| 新平| 象州县| 白沙| 许昌县| 宽甸| 诏安县| 喀什市| 抚远县| 宜宾县| 垣曲县| 武宁县| 东方市| 清镇市| 洱源县| 高碑店市| 台州市| 沂南县|