`
airu
  • 浏览: 270764 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论

每天一个(设计模式)-- Observer模式(Publish/Subscribe模式)

 
阅读更多
今天这个模式,也是面试的时候问到的。其实这个模式最好理解。
观察者,与被观察的物体,订阅者,与被订阅(发布)者。

着这个模式下,我们实现了一对多的一个机制,并且可以针对对感兴趣的事情做订阅,或者观察,一旦有内容就自动通知。生活中这样的例子太多。在java中,也自带这个模式。我们还是先看看这个模式的UML:





一个订阅,一个发布,实际上很清晰明了。现在举个例子吧。天气预报吧。
每天都有气象局发布天气预报,而我们总不能天天打电话问吧,那就好好订阅一个天气服务吧,他会自动给你报。

首先,定义一个可被观察的对象。Oberservable,天气是可以被观察的吧。
public interface WeatherServiceInterface {
	public void subscribeWeatherService(Observer obs);
	public void unsubscribeWeatherService(Observer obs);
	public void notifyObserver(Object obj);
}

这个类名字长了点。不过方便我们读懂。呵呵。这个接口,提供给可以被订阅的天气。
现在实现一个可以报告温度的天气吧。

public class WeatherServiceImpl implements WeatherServiceInterface {

	public List<Observer> observers;
	public float temprature;
	
	public float getTemprature() {
		return temprature;
	}
	public void setTemprature(float temprature) {
		if(this.temprature != temprature){
			this.temprature = temprature;
			this.notifyObserver(this);
		}
		
	}
	public WeatherServiceImpl(){
		this.observers = new ArrayList<Observer>();
	}
	@Override
	public void subscribeWeatherService(Observer obs) {
		// TODO Auto-generated method stub
		observers.add(obs);
	}

	@Override
	public void unsubscribeWeatherService(Observer obs) {
		// TODO Auto-generated method stub
		observers.remove(obs);
	}

	@Override
	public void notifyObserver(Object obj) {
		// TODO Auto-generated method stub
		for(Observer obs:observers){
			obs.update(obj);
		}
	}
	
}


非常的清晰。根据接口,我们的实现也非常简洁。在设置温度的时候,如果温度发生了改变,将通知所有注册的观察者。

现在我们来看看观察者:
public interface Observer {
	public void update(Object obj);
}

一个观察者,需要提供一个接口,让被观察者调用。实现更新。
现在我们有个数据模型,需要根据温度改变而改变他的数据。

public class WeatherModel implements Observer{

	public String name;
	public float temprature;
	public WeatherModel(String name){
		this.name = name;
	}
	@Override
	public void update(Object obj) {
		// TODO Auto-generated method stub
		temprature =((WeatherServiceImpl)obj).getTemprature();
		System.out.println(name + " update temprature to : "+ temprature);
	}

}

这里加入一个name,以便区分不同的订阅者。测试一下:
public class Test {
	public static void main(String [] args){
		WeatherServiceImpl wsi = new WeatherServiceImpl();
		Observer obs1 = new WeatherModel("lily");
		Observer obs2 = new WeatherModel("lucy");
		wsi.subscribeWeatherService(obs1);
		wsi.subscribeWeatherService(obs2);
		
		wsi.setTemprature(20F);
		try{
		Thread.sleep(2);
		}catch(InterruptedException e){}
		wsi.setTemprature(22.30F);
	}
}

结果:

lily update temprature to : 20.0
lucy update temprature to : 20.0
lily update temprature to : 22.3
lucy update temprature to : 22.3

每一个观察者都得到了及时更新数据。
在这个模式下,更新与否,以及更新的频率都交由被观察的对象决定。
  • 大小: 5.5 KB
分享到:
评论

相关推荐

    Observer设计模式实例

    Observer设计模式,也被称为“发布-订阅”(Publish-Subscribe)模式或“依赖倒置”模式,是软件设计中的一种行为模式。它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到...

    设计模式 观察者 发布/订阅 Observer

    当一个对象的改变同时会影响其他对象的行为的时候,可以使用此设计模式。 l 主题对象 :一个需要被关注的主题对象,这个主题对象改变会影响其他对象的行为 l 订阅对象:当主题对象发生改变,订阅对象需要相应处理...

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

    观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在C#编程中广泛应用于实时系统、事件处理和状态管理等领域。 在...

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

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

    观察者模式

    观察者设计模式观察者&lt;Observer&gt;模式(有时又被称为发布-订阅&lt;Publish/Subscribe&gt;模式、模型-视图&lt;Model/View&gt;模式、源-收听者&lt;Source/Listener&gt;模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标...

    设计模式-观察着模型

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

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

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

    java设计模式之观察者模式

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

    设计模式(英文版)

    本资料“设计模式(英文版)”以.htm格式提供,意味着它可能是一个网页文档或者一组相互关联的HTML页面,用于详细阐述设计模式的理论和应用。 设计模式通常分为三类:创建型模式、结构型模式和行为型模式。创建型模式...

    java设计模式之Observer参考.pdf

    Observer模式,也称为发布-订阅(Publish/Subscribe)模式,是一种行为设计模式,它允许对象在状态发生改变时通知其他对象,而无需显示地指定这些对象。在Java中,Observer模式通过`java.util.Observable`和`java....

    优秀的设计模式示例-观察者模式

    这个模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在本文中,我们将深入探讨观察者模式的概念、工作原理以及如何在实际编程中应用。 **观察者模式...

    14-Observer.rar

    观察者设计模式是一种软件设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在IT行业中广泛应用,特别是在事件驱动编程、用户界面组件...

    设计模式—观察者模式

    这个模式是基于发布-订阅(Publish/Subscribe)原则,允许我们定义一个订阅机制来监听对象的变化。 在观察者模式中,有两个主要角色:主题(Subject)和观察者(Observer)。主题是被观察的对象,它可以是任何可以...

    2 观察者模式-课程内容.rar

    这个模式是基于发布-订阅(Publish/Subscribe)模式的一个抽象,是事件驱动编程的一个关键实现方式。 在观察者模式中,有两个主要角色:主题(Subject)和观察者(Observer)。主题是被观察的对象,它可以是任何...

    Observer例子

    "Observer"模式是其中的一种行为设计模式,它定义了对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在这个"Observer例子"中,我们将探讨如何在实际编程中应用...

    李晴川_JavaScript设计模式

    工厂模式是一种创建型设计模式,它定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法把实例化操作推迟到子类中进行。 #### 3. 观察者模式(Observer) 观察者模式是一种对象行为型设计模式。它...

    asp。net c#23个设计模式

    22. 观察者-发布/订阅模式组合(Observer-Publish/Subscribe):发布/订阅模式是观察者模式的一种扩展,允许多对多的关系。 23. 命令-中介者模式组合(Command-Mediator):命令模式将请求封装,而中介者模式协调多...

    java观察者模式观察者模式

    观察者模式是设计模式中的一种行为模式,它在Java编程中有着广泛的应用。该模式的主要目的是定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式也被...

    iOS 设计模式 观察者模式

    观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计中的一种行为模式。在iOS开发中,它是一种让多个对象监听或订阅某一个主题对象的状态变化,并在状态变化时自动收到通知的方式。这种模式使得...

    java设计模式系列之观察者模式代码

    今天我们要深入探讨的是“观察者模式”,也称为发布-订阅(Publish-Subscribe)模式,它属于行为设计模式的一种。这个模式的核心思想是定义对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的...

Global site tag (gtag.js) - Google Analytics