Java 觀察者模式( Observer Pattern),observerpattern

來源:互聯網
上載者:User

Java 觀察者模式( Observer Pattern),observerpattern
觀察者模式

在對象之間定義一對多的依賴,這樣一來,當一個對象改變狀態,依賴它的對象都會收到通知,並自動更新

package gx.subject;import gx.observer.Observer;/** * 主題介面 * @author always * */public interface Subject {    void registerObserver(Observer observer);    void removeObserver(Observer observer);    void notifyObserver();}
package gx.observer;/** *  * 接受到通知後 資料顯示的介面 *  * @author always * */public interface Display {    void display();}
package gx.observer;/** *  * 觀察者的介面 *  * @author always * */public interface Observer {    /**     * pull:觀察者自己獲得的想要的資料:“拉”     */    void update();    /**     * push:主題推送所有訊息給觀察者     *      * @param tiltle     * @param name     * @param summary     */    void update(String tiltle,String name,String summary);}
package gx.observer.impl;import gx.observer.Display;import gx.observer.Observer;import gx.subject.Subject;import gx.subject.impl.CurrentSubject;public class StudentObserver implements Observer,Display{    private Subject subject;    private String title;    private String name;    private String summary;    public StudentObserver(){    }    public StudentObserver(Subject subject){        this.subject=subject;        subject.registerObserver(this);    }    public void update() {        if (subject instanceof CurrentSubject) {            CurrentSubject cs = (CurrentSubject) subject;            this.name=cs.getName();            this.title=cs.getTitle();            this.display();        }    }    public void update(String title, String name, String summary) {        this.title=title;        this.name=name;        this.summary=summary;        this.display();    }    public void display() {        System.out.println("我是一名學生,今天我訂閱的新聞是:\n 新聞標題:"+title+",新聞作者:"+name+",新聞簡介:"+summary+";");    }}
package gx.observer.impl;import gx.observer.Display;import gx.observer.Observer;import gx.subject.Subject;import gx.subject.impl.CurrentSubject;public class TeacherObserver implements Observer,Display{    private Subject subject;    private String title;    private String name;    private String summary;    public TeacherObserver(){    }    public TeacherObserver(Subject subject){        this.subject=subject;        subject.registerObserver(this);    }    public void update() {        if (subject instanceof CurrentSubject) {            CurrentSubject cs = (CurrentSubject) subject;            this.name=cs.getName();            this.title=cs.getTitle();            this.display();        }    }    public void update(String title, String name, String summary) {        this.title=title;        this.name=name;        this.summary=summary;        this.display();    }    public void display() {        System.out.println("我是一名老師,今天我訂閱的新聞是:\n 新聞標題:"+title+",新聞作者:"+name+",新聞簡介:"+summary+";");    }}
package gx.subject.impl;import gx.observer.Observer;import gx.subject.Subject;import java.util.ArrayList;import java.util.List;/** * 這個例子:類比學生,老師 訂閱報紙 *  * 此對象改變 依賴它的對象:observerList 中的對象都會收到通知 *      setData-->notifyObserver-->observer.update()-->observer.display() * @author always * */public class CurrentSubject implements Subject {    private List<Observer> observerList;    private String title;    private String name;    private String summary;    public CurrentSubject(){        observerList=new ArrayList<Observer>();    }    public void registerObserver(Observer observer) {        if(observer!=null){            observerList.add(observer);        }    }    public void removeObserver(Observer observer) {        int indexOf = observerList.indexOf(observer);        if(indexOf!=-1){            observerList.remove(indexOf);        }    }    public void notifyObserver() {        for(Observer observer :observerList){            observer.update(title, name, summary);        }    }    public void setMessage(String title,String name,String summary){        this.title=title;        this.name=name;        this.summary=summary;        notifyObserver();    }    public String getTitle() {        return title;    }    public String getName() {        return name;    }    public String getSummary() {        return summary;    }}

測試類別

package gx.test;import junit.framework.TestCase;import gx.observer.Observer;import gx.observer.impl.StudentObserver;import gx.observer.impl.TeacherObserver;import gx.subject.impl.CurrentSubject;public class TestObserver extends TestCase{    public void testObserverPush(){        CurrentSubject cs= new CurrentSubject();        Observer observer=new StudentObserver(cs);        cs.registerObserver(new StudentObserver());        cs.registerObserver(new TeacherObserver());        cs.setMessage("設計模式","白","你好");//主題狀態改變:this.notifyObserver-->observer.update-->observer.display    }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.