您的位置:首页 > 其它

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

2010-09-10 15:51 92 查看


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

本文介绍设计模式中的(Observer)模式的概念,用法,以及实际应用中怎么样使用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");

}
}
 
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: