一.觀察者模式
在許多的設計中,經常涉及到許多對象都對一個對象的數據變化感興趣,且這多個對象都希望跟蹤這個特殊的對象的數據.
如,職介所與求職者之間的關係,報社與訂閱者之間的關係......
觀察者模式是關於多個對象想知道一個對象中數據變化情況的一種成熟模式,該模式中包含了四個角色,分別是:主題,觀
察者,具體的主題和具體的觀察者,本示例使用了觀察者模式模擬了報社與訂閱者之間的關係.
二. 觀察者模式的類圖如下:
三.完整的示例代碼如下:
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. 運行結果如下:
相关推荐
我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...
撤销功能的实现——备忘录模式(三) 撤销功能的实现——备忘录模式(四) 撤销功能的实现——备忘录模式(五) 观察者模式-Observer Pattern 对象间的联动——观察者模式(一) 对象间的联动——观察者模式(二) ...
观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计...
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...
设计模式之观察者模式ObserverPattern
观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4. J2EE 模式 ...
从生活中的例子可以看出,只要对订阅号... 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为。
1、策略模式STRATEGY PATTERN ...16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21、中介者模式 22、解释器模式 23、亨元模式 24、备忘录模式
在设计一组依赖的对象与它们所依赖的对象之间一致(同步)的交流模型时,观察者模式(Observer Pattern)很有用。它可以使依赖对象的状态与它们所依赖的对象的状态保持同步。这组依赖的对象指的是观察者(Observer)...
文章链接:https://blog.csdn.net/qq_44901285/article/details/116092808?spm=1001.2014.3001.5501 Spring事件机制(Event)-- 基于观察者模式实现多任务同时处理(源码)
观察者模式 行为模式 在对象之间定义一对多的依赖关系,以便当一个对象更改状态时,将自动通知和更新其所有依赖关系。 在此示例中,我们要监视节点上的子创建/删除事件(可用于监视文件夹) 源代码源于以下UML图:
观察者模式(Observer Pattern)是一种对象行为型设计模式,它定义了对象之间的一对多依赖关系。 当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于实现分布式事件处理系统...
主要介绍了Java设计模式之观察者模式(Observer模式)介绍,Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解,需要的朋友可以...
1. 设计模式 1.1 含义 1.2 作用 1.3 设计原则 1.4 分类 2. 简单工厂模式 (SimpleFactoryPattern) 3. 工厂方法模式 (Factory Method) 4. 单例模式 (Singleton) ...17. 观察者模式 (Observer Pattern)
23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。...观察者模式(Observer) 状态模式(State) 策略模式(Strategy) 模板方法模式(Template Method) 访问者模式(Visitor)
工厂方法模式(Factory Method Pattern) 观察者模式(Observer Pattern) 建造者模式(Builder Pattern) 解释器模式(Interpreter Pattern) 命令模式(Command Pattern) 模板方法模式(Template Method Pattern) 桥接模式...
观察者模式(Observer Pattern) 17. 解释器模式(Interpreter Pattern) 18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式...
创建型模式用来处理对象的创建... 观察者模式(Observer Pattern) 状态模式(State Pattern) 策略模式(Strategy Pattern) 模板方法模式(Template Method Pattern) 访问者模式(Visitor Pattern)
开发中常用 设计模式 开发者模式,欢迎大家学习。 博客:http://blog.csdn.net/q610098308/article/details/76143959