`
lgd_java2eye
  • 浏览: 189582 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多


 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");
		
	}
}
 
  • 大小: 30.4 KB
  • 大小: 18.4 KB
分享到:
评论

相关推荐

    设计模式-观察者模式-作业-observer.zip

    观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或发布-...

    设计模式系列博客--观察者模式

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的系统或者...

    设计模式--观察者模式java例子

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...

    设计模式C++学习之观察者模式(Observer)

    观察者模式(Observer)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在C++中广泛应用,特别是在需要...

    Observer 观察者模式 示例 源码 ----设计模式

    观察者模式 概述 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 适用性 1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。 将这二者封装...

    observer-pattern-demo 观察者模式示例

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java中,我们可以利用Java的内置接口`java.util.Observer`和`java.util....

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

    观察者模式是一种行为设计模式,它允许你定义一个订阅机制,可以及时地在对象之间传播状态变化。在Java中,观察者模式常用于构建事件驱动系统,使得多个对象能够监听并响应某个对象的状态改变。 首先,我们要理解...

    设计模式之观察者模式(Observer Pattern)

    观察者模式,也被称为发布-订阅模式或事件驱动模式,是软件设计模式中的一种行为模式。这个模式的主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...

    C++设计模式--观察者模式 demo

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它在C++中的应用广泛且实用。这种模式的核心思想是“主体”(Subject)与“观察者”(Observer)之间的松耦合关系,允许一个对象(即主体)的状态...

    Java 设计模式-观察者模式(Observer)

    结合微信公众号讲解观察者模式,生动形象,关键是上手快啊

    设计模式之观察者模式Java实现

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...

    设计模式之观察者模式(Observer)

    观察者模式(Observer)是软件设计模式中的一种行为模式,其主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动...

    设计模式-观察者

    观察者模式(Observer Pattern)是行为设计模式的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心思想是发布-订阅模型,其中...

    HeadFirst 设计模式学习笔记2--观察者模式 demo

    观察者模式是设计模式中的一种行为模式,它在软件工程中扮演着重要的角色,尤其是在构建可扩展和可维护的系统时。HeadFirst的设计模式系列书籍以其直观易懂的方式深受程序员喜爱,本笔记将深入探讨观察者模式的概念...

    设计模式--观察者 c++版本

    在给定的“设计模式--观察者 c++版本”中,我们主要关注的是观察者模式(Observer Pattern)在C++语言中的实现。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,...

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)

    **C#面向对象设计模式纵横谈(19)**:**观察者模式**(Observer Pattern)是行为型模式的一种,它在软件工程中扮演着至关重要的角色。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...

    [行为模式]head first 设计模式之观察者模式(observer)

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在软件开发中广泛应用于事件驱动...

    设计模式-观察者模式(讲解及其实现代码)

    总结来说,观察者模式是一种重要的设计模式,它允许对象在状态改变时自动通知其他对象,从而降低了系统各部分之间的耦合度,提高了代码的灵活性和可扩展性。在实际项目中,正确使用观察者模式可以有效地管理组件间的...

Global site tag (gtag.js) - Google Analytics