`
xgcai
  • 浏览: 8654 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

设计模式--观察者模式"推"数据

 
阅读更多

观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖他的对象得到通知并被自动更新。

 

观察者模式机构的四种角色:

1、主题:是一个接口,定义具体主题需要实现的方法,如:添加、删除、通知观察者的方法。

2:、观察者:是一个接口,定义具体观察者用来更新数据的方法。

3、具体主题:主题接口的实现类,需要包含一个集合,用来存放观察者的引用,以便数据变化时通知具体观察者。

4、具体观察者:观察者的实现类,包含主题接口的变量,以便具体主题将自己添加或删除在主题存放观察者的集合的引用。

 

UML:

 

 

 观察者模式 “推”:具体主题变化后数据全部交给具体观察者。

例子,求职中心与求职者,有一个大学毕业生和一个留学生都希望能及时知道求职中心最新的职业需求信息。

 

Subject:

/**
 * 
 */
package org.rico.pattern.demo.observer;

/**
 * @author rico 2013-3-3
 *  主题:定义具体主题需要实现的方法,如:添加、删除、通知观察者的方法。
 */
public interface Subject {
	
	/**
	 * 新增观察者
	 * @param observer
	 */
	public void add(Observer observer);
	
	/**
	 * 删除观察者
	 * @param observer
	 */
	public void delete(Observer observer);
	
	/**
	 * 主题通知观察者更新数据
	 */
	public void notifyObserver();
	
}

 

Observer:

/**
 * 
 */
package org.rico.pattern.demo.observer;

/**
 * @author rico 2013-3-3
 *  定义具体观察者用来更新数据的方法。
 */
public interface Observer {
	
	/**
	 * 观察者接受主题数据变化的通知,然后更新自己的数据。
	 * @param msg
	 */
	public void update(String msg);
}

 

HaiGuiStudent:

/**
 * 
 */
package org.rico.pattern.demo.observer.impl;

import org.rico.pattern.demo.observer.Observer;
import org.rico.pattern.demo.observer.Subject;

/**
 * @author rico 2013-3-3
 * 具体观察者(留学生),包含主题接口的变量,以便具体主题将自己添加或删除在主题存放观察者的集合的引用
 */
public class HaiGuiStudent implements Observer {
	private Subject subject;
	
	public HaiGuiStudent(Subject subject) {
		this.subject = subject;
		subject.add(this);
	}

	/* 更新数据(non-Javadoc)
	 * @see org.rico.pattern.demo.observer.Observer#update(java.lang.String)
	 */
	@Override
	public void update(String msg) {
		System.out.println("HaiGuiStudent: " + msg);
	}

}

 

JobCenter:

/**
 * 
 */
package org.rico.pattern.demo.observer.impl;

import java.util.ArrayList;
import java.util.List;

import org.rico.pattern.demo.observer.Observer;
import org.rico.pattern.demo.observer.Subject;

/**
 * @author rico 2013-3-3
 * 求职中心(具体主题)
 */
public class JobCenter implements Subject {
	private List<Observer> observers = null;
	private String msg;
	
	public JobCenter() {
		observers = new ArrayList<Observer>();
	}

	/* 新增求职者(non-Javadoc)
	 * @see org.rico.pattern.demo.observer.Subject#add(org.rico.pattern.demo.observer.Observer)
	 */
	@Override
	public void add(Observer observer) {
		if(!observers.contains(observer)) {
			observers.add(observer);
		}
	}

	/* 删除求职者(non-Javadoc)
	 * @see org.rico.pattern.demo.observer.Subject#delete(org.rico.pattern.demo.observer.Observer)
	 */
	@Override
	public void delete(Observer observer) {
		if(observers.contains(observer)) {
			observers.remove(observer);
		}
	}

	/* 数据更新,通知求职者(non-Javadoc)
	 * @see org.rico.pattern.demo.observer.Subject#notifyObserver()
	 */
	@Override
	public void notifyObserver() {
		for(Observer ob : observers) {
			ob.update(msg);
		}
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

}

 

UniversityStudent:

/**
 * 
 */
package org.rico.pattern.demo.observer.impl;

import org.rico.pattern.demo.observer.Observer;
import org.rico.pattern.demo.observer.Subject;

/**
 * @author rico 2013-3-3
 * 具体观察者(大学毕业生),包含主题接口的变量,以便具体主题将自己添加或删除在主题存放观察者的集合的引用
 */
public class UniversityStudent implements Observer {
	private Subject subject;
	
	public UniversityStudent(Subject subject) {
		this.subject = subject;
		subject.add(this);
	}

	/* 更新数据(non-Javadoc)
	 * @see org.rico.pattern.demo.observer.Observer#update(java.lang.String)
	 */
	@Override
	public void update(String msg) {
		System.out.println("UniversityStudent: " + msg);
	}

}

 

 ObserverTest:

/**
 * 
 */
package org.rico.pattern.demo.observer;

import org.rico.pattern.demo.observer.impl.HaiGuiStudent;
import org.rico.pattern.demo.observer.impl.JobCenter;
import org.rico.pattern.demo.observer.impl.UniversityStudent;

/**
 * @author rico 2013-3-3
 * 
 */
public class ObserverTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JobCenter jobCenter = new JobCenter();
		Observer university = new UniversityStudent(jobCenter);
		Observer haigui = new HaiGuiStudent(jobCenter);
		
		System.out.println("###################job one#######################");
		jobCenter.setMsg("job one......");
		jobCenter.notifyObserver();
		
		System.out.println("###################job two#######################");
		jobCenter.setMsg("job two......");
		jobCenter.notifyObserver();
		
		System.out.println("###################job three#######################");
		jobCenter.delete(university);
		jobCenter.setMsg("job three......");
		jobCenter.notifyObserver();
	}

}

 

 

 

 

 

 

 

 

  • 大小: 45.5 KB
分享到:
评论

相关推荐

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

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

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

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

    C++设计模式--基于Qt4开源跨平台开发框架

    行为型模式如观察者模式(Observer)、策略模式(Strategy)和访问者模式(Visitor),关注对象之间的交互和责任分配。 在C++中,设计模式的应用通常涉及到面向对象编程的特性,如继承、封装和多态。Qt4框架则为...

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

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

    跟我一起学 设计模式-观察者模式

    观察者模式,也称为发布-订阅模式或事件驱动模式,是一种行为设计模式,它定义了对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 在C#、ASP.NET等.NET框架中,...

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

    在文件名为"weatherStation_observer_push"的压缩包中,我们可以猜测这是一个关于天气观测站的示例,它可能使用了观察者模式来实现实时天气数据的推送。在这个例子中,天气站(被观察者)是核心数据源,它会发布温度...

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

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

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

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

    Java设计模式-第22章-观察者模式.ppt

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

    设计模式实现——观察者模式

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

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

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

    C++设计模式-基于QT4开源跨平台开发框架 源码

    3. **观察者模式** - QT4的信号和槽机制是观察者模式的实现。当一个对象的某个状态改变时,它可以发出信号,其他对象可以通过连接这些信号并定义槽函数来响应这些变化,实现了事件驱动的编程模型。 4. **装饰器模式...

    设计模式-观察者模式

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

    Qt设计模式之观察者模式

    本篇文章将深入探讨Qt中的观察者模式(Observer Pattern),这是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心...

    设计模式-观察着模型

    观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计中的一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。...

    JAVA设计模式--程序设计--反射--注解--泛型

    设计模式包括创建型模式(如单例、工厂方法、抽象工厂等)、结构型模式(如适配器、装饰器、代理等)和行为型模式(如策略、观察者、职责链等)。这些模式提供了良好的可复用性和可扩展性,帮助开发者遵循“开闭原则...

    设计模式例子,观察者模式,建造者模式

    在给定的压缩包文件中,"设计模式例子,观察者模式,建造者模式" 提到了两种重要的设计模式:观察者模式(Observer Pattern)和建造者模式(Builder Pattern)。下面我们将深入探讨这两种设计模式的概念、应用场景、...

    java 设计模式 观察者模式 简单实例 包括测试test类

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

    观察者体系结构微博

    观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计中的一种行为设计模式,它允许对象在状态改变时通知其他依赖它的对象,而无需显式地调用这些对象。在这个“观察者体系结构微博”项目中,我们...

Global site tag (gtag.js) - Google Analytics