首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计形式之Observer - 观察者模式

2012-09-19 
设计模式之Observer - 观察者模式?Observer模式也叫观察者模式,是由GoF提出的23种软件设计模式的一种。Obse

设计模式之Observer - 观察者模式


?Observer模式也叫观察者模式
,是由GoF提出的23种软件设计模式的一种。Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。

本文介绍设计模式中的(Observer)模式的概念,用法,以及实际应用中怎么样使用Observer模式进行开发。

Observer模式的角色:
Subject(被观察者)
????被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。
ConcreteSubject
????被观察者的具体实现。包含一些基本的属性状态及其他操作。
Observer(观察者)
????接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
ConcreteObserver
????观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。
?


?
?
?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 {@Overridepublic 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 {@Overridepublic 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 {@Testpublic void test(){  NewsPublisher publisher = new NewsPublisher();     Number1SubscriberObserver subscriber1=new Number1SubscriberObserver();  Number2SubscriberObserver subscriber2=new Number2SubscriberObserver();  publisher.addObserver(subscriber1);  publisher.addObserver(subscriber2);  publisher.publisherNews("国际新闻", "djfidfdkkkkkkkkkkkkkkkkkkkkkkkkk");}}
?

热点排行