设计模式之Observer - 观察者模式
2010-09-10 15:51
92 查看
Observer模式也叫观察者模式,是由GoF提出的23种软件设计模式的一种。Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。
Observer模式的概念 Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。
Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。 Observer模式的典型应用 1:侦听事件驱动程序设计中的外部事件
2:侦听/监视某个对象的状态变化
3:发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者 Observer模式的优点 1:对象之间可以进行同步通信
2:可以同时通知一到多个关联对象
3:对象之间的关系以松耦合的形式组合,互不依赖 Observer模式的结构
Observer模式的角色:
Subject(被观察者)
被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。
ConcreteSubject
被观察者的具体实现。包含一些基本的属性状态及其他操作。
Observer(观察者)
接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
ConcreteObserver
观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。 JDK对Observer模式的支持 JDK提供了对observer设计模式的支持:
1:通过java.util.Observable类扮演Subject角色,一个类只需通过继承java.util.Observable类便可担当ConcreteSubject角色;
2:通过java.util.Observer接口扮演Observer角色,一个类只需实现java.util.Observer接口便可担当ConcreteObserver角色。
3:java.util.Observable的实现类通过调用setChanged()方法以及notifyObservers(Object)方法便可简单地通知Observer。
当然,我们也可以不使用JDK提供的类与接口而自己实现Observer模式。 Observer模式的应用范例 Client
测试类。
NewsPublisher 相当于ConcreteSubject角色。该类继承相当于Subject角色的java.util.Observable类。
SubscriberObserver
相当于ConcreteObserver角色。该类实现了相当于Observer角色的java.util.Observer接口。当NewsPublisher对象发生变化时得到通知,并向订阅者发送订阅邮件。
Number1SubscriberObserver
相当于ConcreteObserver角色。该类继承了SubscriberObserver类,给1号订阅者发送订阅邮件 Number2SubscriberObserver
相当于ConcreteObserver角色。该类继承了SubscriberObserver类,给2号订阅者发送订阅邮件
News
封装了新闻数据的类,与Observer模式无直接关系。 uml类图:
package com.gd.observer; import java.util.Observable; import java.util.Observer; import com.gd.model.News; /** * * @author sandy * */ public abstract class SubscriberObserver implements Observer { public void update(Observable o, Object arg){ if(arg instanceof News){ mail2Subscriber(arg); } } public abstract void mail2Subscriber(Object object); }
package com.gd.observer; import com.gd.model.News; /** * * @author sandy * 一号观察者订户 */ public class Number1SubscriberObserver extends SubscriberObserver { @Override public void mail2Subscriber(Object object) { News news=(News)object; System.out.println("给第1个订阅的用户发送邮件消息主题为:"+news.getTitle()); } }
package com.gd.observer; import com.gd.model.News; /** * * @author sandy * 第2号订阅者 */ public class Number2SubscriberObserver extends SubscriberObserver { @Override public void mail2Subscriber(Object object) { News news=(News)object; System.out.println("给第2个订阅的用户发送邮件消息主题为:"+news.getTitle()); } }
package com.gd.observable; import java.util.Observable; import com.gd.model.News; /** * * @author sandy * 新闻的发布 */ public class NewsPublisher extends Observable { public void publisherNews(String newsTitle,String newsBody){ News news=new News(newsTitle,newsBody); this.setChanged(); System.out.println("新闻的发布:"+newsTitle); //通知每一个observer,并发送一个一个名字为news的对象 this.notifyObservers(news); } }
package com.gd.model; /** * * @author sandy * */ public class News { private String title; private String body; public News(String title, String body) { super(); this.title = title; this.body = body; } /** * @return the title */ public String getTitle() { return title; } /** * @return the body */ public String getBody() { return body; } }
/** * */ package com.gd.test; import org.junit.Test; import com.gd.observable.NewsPublisher; import com.gd.observer.Number1SubscriberObserver; import com.gd.observer.Number2SubscriberObserver; /** * @author sandy * */ public class Client { @Test public void test(){ NewsPublisher publisher = new NewsPublisher(); Number1SubscriberObserver subscriber1=new Number1SubscriberObserver(); Number2SubscriberObserver subscriber2=new Number2SubscriberObserver(); publisher.addObserver(subscriber1); publisher.addObserver(subscriber2); publisher.publisherNews("国际新闻", "djfidfdkkkkkkkkkkkkkkkkkkkkkkkkk"); } }
阅读更多
相关文章推荐
- 设计模式之美:Observer(观察者)
- 设计模式:Observer模式 之 互为观察者与被观察者
- 设计模式理解 - 伟大的【Observer 观察者模式】
- 设计模式——观察者模式 Observer
- 【转载】.NET设计模式之观察者模式(Observer Pattern)
- 设计模式(19)—— Observer (观察者)
- 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)
- 漫谈设计模式之观察者模式(Observer)
- C++设计模式之十七--Observer观察者模型
- 设计模式In Android——观察者(Observer)模式_1
- 设计模式二:观察者模式(Observer Pattern)
- 设计模式之观察者(Observer)模式与其C++通用实现(中)
- 设计模式之观察者模式 (Observer Design Pattern)
- 学习php设计模式 php实现观察者模式(Observer)
- 设计模式学习笔记---观察者模式Observer pattern(Java版)
- Net设计模式实例之观察者模式(Observer Pattern)
- 二十四种设计模式:观察者模式(Observer Pattern)
- 设计模式之七 --- 观察者模式(Observer)
- 设计模式总结之Observer Pattern(观察者模式)
- 设计模式-观察者模式(Observer Pattern)