一.觀察者模式
在許多的設計中,經常涉及到許多對象都對一個對象的數據變化感興趣,且這多個對象都希望跟蹤這個特殊的對象的數據.
如,職介所與求職者之間的關係,報社與訂閱者之間的關係......
觀察者模式是關於多個對象想知道一個對象中數據變化情況的一種成熟模式,該模式中包含了四個角色,分別是:主題,觀
察者,具體的主題和具體的觀察者,本示例使用了觀察者模式模擬了報社與訂閱者之間的關係.
二. 觀察者模式的類圖如下:
三.完整的示例代碼如下:
1. 主題
package behavioralPattern.observer.observer1; /** * @ClassName: Subject * @Description: TODO(主題接口) * @author Liyongbin * @date 2011-2-7 上午11:39:53 * @version V1.0 */ public interface ISubject { //添加一個觀察者 public void addObserver(IObserver o); //刪除一個觀察者 public void removeObserver(IObserver o); //通知一個觀察者 public void notifyObserver(); }
2. 觀察者
package behavioralPattern.observer.observer1; /** * @ClassName: Observer * @Description: TODO(觀察者) * @author Liyongbin * @date 2011-2-7 上午11:46:27 * @version V1.0 */ public interface IObserver { /** * 觀察的內容 * @param news 新聞 * @param lapseRate 氣溫 */ public void update(String news,float lapseRate); }
3. 顯示新聞和天氣信息
package behavioralPattern.observer.observer1; /** * @ClassName: IDisplayContent * @Description: 顯示新聞和天氣信息 * @author Liyongbin * @date 2011-2-7 下午04:09:24 * @version V1.0 */ public interface IDisplayContent { public void display(); }
4. 出版社類[具體主題]
package behavioralPattern.observer.observer1; import java.util.ArrayList; import java.util.List; /** * @ClassName: Publish * @Description:(出版社類) * @author Liyongbin * @date 2011-2-7 上午11:33:23 * @version V1.0 */ public class Publish implements ISubject { // 用來存放訂閱者 public List<IObserver> observers = new ArrayList<IObserver>(); // 更新新聞和氣溫 public boolean changed; // 新聞 public String news; // 氣溫 public float lapseRate; /** * 構造方法 */ public Publish() { changed = false; news=""; lapseRate=0.0f; } /** * 添加訂閱者 */ @Override public void addObserver(IObserver observer) { // 訂閱者名單中不存在該訂閱者時,將其添加進來 if (!observers.contains(observer)) { observers.add(observer); } } /** * 通知訂閱者 */ @Override public void notifyObserver() { if (changed) { for (IObserver observer:observers) { observer.update(news, lapseRate); } } } /** * 刪除訂閱者 */ @Override public void removeObserver(IObserver observer) { // 訂閱者名單中存在該訂閱者時,將其刪除 if (observers.contains(observer)) { observers.remove(observer); } } /** * 更新今天的新聞 */ public void changeCurrentMessages(String news,float lapseRate){ if (this.news.equals(news) && this.lapseRate==lapseRate) { changed=false; }else{ this.news=news; this.lapseRate=lapseRate; changed=true; } } }
5.具體的觀察者--訂閱者A
package behavioralPattern.observer.observer1; /** * @ClassName: Subscribe_A * @Description: TODO(訂閱者A) * @author Liyongbin * @date 2011-2-7 下午12:04:04 * @version V1.0 */ public class Subscribe_A implements IObserver,IDisplayContent { private String name; private String news; private float lapseRate; public Subscribe_A() { name="用戶: Subscribe_A"; } //更新新聞 @Override public void update(String news, float lapseRate) { this.news=news; this.lapseRate=lapseRate; } //顯示新聞 @Override public void display() { System.out.println(name); System.out.println("今天的新聞是:"+news); System.out.println("今天的氣溫是:"+lapseRate+"度"); } }
具體的觀察者--訂閱者B
package behavioralPattern.observer.observer1; /** * @ClassName: Subscribe_B * @Description: TODO(訂閱者A) * @author Liyongbin * @date 2011-2-7 下午12:04:04 * @version V1.0 */ public class Subscribe_B implements IObserver,IDisplayContent { private String name; private String news; private float lapseRate; public Subscribe_B() { name="用戶: Subscribe_B"; } //更新新聞 @Override public void update(String news, float lapseRate) { this.news=news; this.lapseRate=lapseRate; } //顯示新聞 @Override public void display() { System.out.println(name); System.out.println("今天的新聞是:"+news); System.out.println("今天的氣溫是:"+lapseRate+"度"); } }
具體的觀察者--訂閱者C
package behavioralPattern.observer.observer1; /** * @ClassName: Subscribe_C * @Description: TODO(訂閱者C) * @author Liyongbin * @date 2011-2-7 下午12:04:04 * @version V1.0 */ public class Subscribe_C implements IObserver,IDisplayContent { private String name; private String news; private float lapseRate; public Subscribe_C() { name="用戶: Subscribe_C"; } //更新新聞 @Override public void update(String news, float lapseRate) { this.news=news; this.lapseRate=lapseRate; } //顯示新聞 @Override public void display() { System.out.println(name); System.out.println("今天的新聞是:"+news); System.out.println("今天的氣溫是:"+lapseRate+"度"); } }
6.測試代碼如下:
package behavioralPattern.observer.observer1; /** * @ClassName: ObserverTest * @Description: 測試觀察者模式 * @author Liyongbin * @date 2011-2-7 下午12:05:52 * @version V1.0 */ public class ObserverTest { public static void main(String[] args) { Publish publish = new Publish(); Subscribe_A sa = new Subscribe_A(); Subscribe_B sb = new Subscribe_B(); Subscribe_C sc = new Subscribe_C(); //更新新聞 publish.changeCurrentMessages("經濟新聞", 23.4f); //添加訂閱者 publish.addObserver(sa); publish.addObserver(sb); publish.addObserver(sc); //通知訂閱者 publish.notifyObserver(); System.out.println("---------------------"); sa.display(); sb.display(); sc.display(); //用戶B 退出訂閱 publish.removeObserver(sb); //更新新聞 publish.changeCurrentMessages("體育新聞", 15.7f); //通知訂閱者 publish.notifyObserver(); System.out.println("---------------------"); sa.display(); sb.display(); sc.display(); } }
7. 運行結果如下:
相关推荐
代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(...观察者模式(Observer Pattern)、责任链模式(Chain of Responsibility Pattern)、访问者模式(Visitor Pattern)、状态模式(State ...
Java设计模式中的观察者模式(Observer Pattern)是一种对象行为型模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于事件处理和实时...
我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...
观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或发布-...
包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式...
观察者模式(Observer Pattern)是其中一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 在Java中,观察者模式通常通过`java.util....
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java中,我们可以利用Java的内置接口`java.util.Observer`和`java.util....
在这个名为"JAVA design pattern-java设计模式"的CHM文件中,我们可能找到了关于如何在Java开发中应用设计模式的详细信息。 设计模式通常分为三大类:创建型、结构型和行为型。创建型模式关注对象的创建,如单例...
观察者模式,也被称为发布-订阅模式或事件驱动模式,是软件设计模式中的一种行为模式。这个模式的主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...
观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。该模式适用于需要在对象间建立动态的、松散耦合的关系的...
观察者模式(Observer Pattern)是行为设计模式的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心思想是发布-订阅模型,其中...
撤销功能的实现——备忘录模式(三) 撤销功能的实现——备忘录模式(四) 撤销功能的实现——备忘录模式(五) 观察者模式-Observer Pattern 对象间的联动——观察者模式(一) 对象间的联动——观察者模式(二) ...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它在C++中的应用广泛且实用。这种模式的核心思想是“主体”(Subject)与“观察者”(Observer)之间的松耦合关系,允许一个对象(即主体)的状态...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于事件驱动编程,例如用户...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动编程或者...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或者发布...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在软件开发中广泛应用于事件驱动...
**C#面向对象设计模式纵横谈(19)**:**观察者模式**(Observer Pattern)是行为型模式的一种,它在软件工程中扮演着至关重要的角色。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...