<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-159  評論-114  文章-7  trackbacks-0

    模式是什么?

    模式是一個范式,一個在相同環境或者狀況下的一種通用解決辦法,解決方案。就好像孫子兵法,對于某種特定戰局,戰況下的一種派兵布陣策略和實施步驟的總結。

    模式需要什么呢?

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

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

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

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

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

    那么鐘表就是observable,就是那個常說的Subject,而家人就是具體的Observer,實現了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接口,是一個概念模型,提供給Timer,Timer只關心,自身改變狀態后,要調用的觀察者什么行為,并不關心觀察者本身。所以提取人的若干行為,抽象成為接口。

    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;
        }


    }


    這是一個主人的類,也就是一類具體的Observer。

    output.jpg


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

    其實這種模式就是一種回調的應用,就是想其它類中注冊自己的接口,到特定時候調用自己的方法。

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



    posted on 2005-11-27 11:26 北國狼人的BloG 閱讀(439) 評論(0)  編輯  收藏 所屬分類: 達內學習總結
    主站蜘蛛池模板: 国产在线观看免费完整版中文版| 亚洲人成在线播放网站| 午夜免费不卡毛片完整版| 国产一级淫片免费播放| 久久人午夜亚洲精品无码区| 久久精品免费视频观看| 亚洲av日韩av天堂影片精品| 污污网站18禁在线永久免费观看| 亚洲爱情岛论坛永久| 99视频有精品视频免费观看| 国产免费看插插插视频| 色屁屁www影院免费观看视频| 相泽亚洲一区中文字幕| 亚洲人成电影网站免费| 无码国产亚洲日韩国精品视频一区二区三区 | 黄色免费网址大全| 亚洲国产另类久久久精品小说| 怡红院免费全部视频在线视频| 内射少妇36P亚洲区| 一区二区视频免费观看| 亚洲理论电影在线观看| 亚洲美女免费视频| 无码乱人伦一区二区亚洲一| 精品国产污污免费网站aⅴ| 亚洲av色香蕉一区二区三区| 亚洲国产精品毛片av不卡在线 | 日韩在线观看免费完整版视频| 国产亚洲真人做受在线观看| 91精品免费观看| 亚洲成A人片777777| 真人做A免费观看| 有码人妻在线免费看片| 久久久久久亚洲Av无码精品专口 | 亚洲成人免费在线观看| 99亚洲精品卡2卡三卡4卡2卡| 亚洲国产三级在线观看| 成人性生交大片免费看无遮挡| jizz免费在线影视观看网站| 亚洲精品在线免费观看视频| 免费一级毛片女人图片| 中文字幕免费在线看线人 |