Java中的观察者模式
让一个类能够被观察,则该类需要继承java.util.Observable类。
要让一个类成为观察者,则该类需要实现java.util.Observable接口。
让观察者和被观察者建立联系通过Observable的addObserver(Object obj)方法。
让被观察者通知观察者,通过Observable类中的setChanged()和notifyObservers(Object obj)方法。
下面的例子定义了一个售房中心类和一个卖家类。售房中心为被观察者,买房者为观察者。售房中心房价发生变化,则将相应的信息通知买房者。
代码如下:
import java.util.*; class HouseSellCenter extends Observable
{
public String name;
public float price;
public HouseSellCenter(String name, float price)
{
this.name = name;
this.price = price;
} public void changePrice(float price)
{
this.price = price;
super.setChanged();
super.notifyObservers(price);
} public String toString()
{
return "name:" + this.name + " price:" +this.price;
}
} class Buyer implements Observer
{
public String name;
public Buyer(String name)
{
this.name = name;
} public void update(Observable o, Object arg)
{
HouseSellCenter hsc = (HouseSellCenter)o;
System.out.println(this.name+"观察到:"+hsc.name+"房价变为:" + arg + "万");
}
} class Hello
{
public static void main(String[] args)
{
HouseSellCenter hsc = new HouseSellCenter("金悦城",1.3f);
Buyer buyer1 = new Buyer("金旭地产");
Buyer buyer2 = new Buyer("龙城中介");
Buyer buyer3 = new Buyer("祥龙置业");
hsc.addObserver(buyer1);
hsc.addObserver(buyer2);
hsc.addObserver(buyer3); System.out.println("============");
hsc.changePrice(1.5f);
System.out.println("============"); sleep(3000); System.out.println("============");
hsc.changePrice(1.2f);
System.out.println("============");
} public static void sleep(int timeSpan)
{
try
{
Thread.sleep(timeSpan);
}
catch (Exception e)
{
System.out.println(e);
}
}
}
输出结果:
============
祥龙置业观察到:金悦城房价变为:1.5万
龙城中介观察到:金悦城房价变为:1.5万
金旭地产观察到:金悦城房价变为:1.5万
============
============
祥龙置业观察到:金悦城房价变为:1.2万
龙城中介观察到:金悦城房价变为:1.2万
金旭地产观察到:金悦城房价变为:1.2万
============
上面的代码是利用了Java对观察者模式的支持。下面用另一个例子说明观察者模式运行规则。
Observerable接口(定义被观察者的规范):
public interface Observerable
{
void addObserver(ObserverBehavior newObserver);
void removeObserver(ObserverBehavior observerToBeRemoved);
void notifyAllObservers();
}
ObserverBehavior接口(定义观察者的规范):
public interface ObserverBehavior
{
void update(float temperature, float humidity, float pressure);
}
WeatherData类实现Observerable接口,其是真实的被观察者类:
import java.util.List;
import java.util.ArrayList; public class WeatherData implements Observerable
{
private List<ObserverBehavior> observerList;
private float temperature;
private float humidity;
private float pressure; public WeatherData()
{
this.observerList = new ArrayList<ObserverBehavior>();
} @Override
public void addObserver(ObserverBehavior newObserver)
{
// TODO Auto-generated method stub
this.observerList.add(newObserver);
} @Override
public void notifyAllObservers()
{
// TODO Auto-generated method stub
for(ObserverBehavior observer : this.observerList)
{
observer.update(this.temperature, this.humidity, this.pressure);
}
} @Override
public void removeObserver(ObserverBehavior observerToBeRemoved)
{
// TODO Auto-generated method stub
this.observerList.remove(observerToBeRemoved);
} public void weatherChanged(float temperature, float humidity, float pressure)
{
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure; this.notifyAllObservers();
}
}
MobileDevices实现ObserverBehavior类(真正的观察者):
public class MobileDevices implements ObserverBehavior
{
private String name;
public MobileDevices(String name)
{
this.name = name;
}
@Override
public void update(float temperature, float humidity, float pressure)
{
// TODO Auto-generated method stub
System.out.println(this.name + "观察到当前 --> 温度:" + temperature + " 湿度:" + humidity + " 气压:" + pressure);
} @Override
public boolean equals(Object obj)
{
if(this == obj)
return true; if(!(obj instanceof MobileDevices))
return false; MobileDevices otherOne = (MobileDevices)obj;
if(this.name.equals(otherOne.name))
return true;
else
return false;
} }
WhiteBoard实现了ObserverBehavior类(另一个真正的观察者):
public class WhiteBoard implements ObserverBehavior
{
private String name;
public WhiteBoard(String name)
{
this.name = name;
} @Override
public void update(float temperature, float humidity, float pressure)
{
// TODO Auto-generated method stub
System.out.println(this.name + "观察到当前 --> 温度:" + temperature + " 湿度:" + humidity + " 气压:" + pressure);
} }
主方法测试:
public class Tester
{ /**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
WeatherData subject = new WeatherData();
WhiteBoard wb = new WhiteBoard("中央广场白板");
MobileDevices iphone = new MobileDevices("iphone手机");
MobileDevices android = new MobileDevices("安卓手机");
subject.addObserver(wb);
subject.addObserver(iphone); subject.weatherChanged(12, 23, 33);
subject.removeObserver(new MobileDevices("iphone手机"));
subject.addObserver(android); subject.weatherChanged(22, 43, 25);
}
}
输出结果:
中央广场白板观察到当前 --> 温度:12.0 湿度:23.0 气压:33.0
iphone手机观察到当前 --> 温度:12.0 湿度:23.0 气压:33.0
中央广场白板观察到当前 --> 温度:22.0 湿度:43.0 气压:25.0
安卓手机观察到当前 --> 温度:22.0 湿度:43.0 气压:25.0
总结:
被观察者应该具备以下功能:
1) 能增加一个观察者 addObserver
2)能移除一个观察者 removeObserver
3)在数据改变的时候能将相应的信息通知给被观察者 notifyAllObservers
观察者应具备以下功能:
1) update方法用于观察者接收被观察者的推送信息
Java中的观察者模式的更多相关文章
- 设计模式:java及spring观察者模式(有利于代码解耦)
http://www.cnblogs.com/softidea/p/5716870.html 什么是ApplicationContext? 它是Spring的核心,Context我们通常解释为上下文环 ...
- java中观察者模式Observable和Observer
25.java中观察者模式Observable和Observer 如果想要实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口 观察者设计模式 现在很多的 ...
- Java中使用Observer接口和Observable类实践Observer观察者模式
在Java中通过Observable类和Observer接口实现了观察者模式.实现Observer接口的对象是观察者,继承Observable的对象是被观察者. 1. 实现观察者模式 实现观察者模式非 ...
- java设计模式之观察者模式以及在java中作用
观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependen ...
- java中jna使用回调实现事件监听器——观察者模式
(1)C接口中的接口头文件 #pragma once #include <iostream> #include <vector> #include <core/core. ...
- java中的23中设计模式(转)
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- java中的23中设计模式(转载的,有时间一定要熟读)
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Java中的图形界面编程
前言 正文 Java中的图形界面编程 AWT/Swing AWT(Abstract Window ToolKits,抽象窗体工具集) 1.容器类:用来存储组件,实现容器布局 2.组件类:实现界面的一些 ...
- 面试中关于Java中涉及到知识点(转)
本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺. 1. Java中的原始数据类型都有哪些, ...
随机推荐
- JAVA除法保留小数点后两位的两种方法 Java Math的 floor,round和ceil的总结
floor 返回不大于的最大整数 round 则是4舍5入的计算,入的时候是到大于它的整数round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下 ...
- comet基于HTTP长连接技术(java即时通信,推送技术详解)
服务器推送技术的基础思想是将浏览器主动查询信息改为服务器主动发送信息,服务器发送一批数据,浏览器显示消息,同时保证与服务器的连接,当服务器需要再一次的发送数据,浏览器显示数据并保持连接. comet基 ...
- C语言strlen函数和sizeof操作符
字符'x'于字符串"x"的区别 'x' 属于基本类型(char)字符类型-----------------由1个字符组成('x') "x"属于派生类型(char ...
- Redis学习手册(服务器管理)
转:http://www.cnblogs.com/stephen-liu74/archive/2012/02/27/2369480.html 一.概述: Redis在设计之初就被定义为长时间不间断运行 ...
- R(七): R开发实例-map热力图
第四章通过REmap包完成基于map分布图示例,前面提到REmap基于Echart2.0, 一方面在移动终端适应效果差,另一方面REmap提供的热力图仅支持全国及省市大版块map,基于上面的原因,参考 ...
- HDP2.4安装(五):集群及组件安装
HDP(Hortonworks Data Platform)是hortworks推出的100%开源的hadoop发行版本,以YARN 作为其架构中心,包含pig.hive.phoniex.hbase. ...
- SharePoint 2010 最佳实践学习总结------第2章 SharePoint Windows PowerShell指南
第2章 SharePoint Windows PowerShell指南 SharePoint 2010是SharePoint系列产品中第一个开始支持Windows PowerShell的产品,在以前的 ...
- [Hibernate] - Annotations - One To One
Hibernate annotation 一对一的两种实现: 1)幅表中有主表的主键ID做为引用 2)幅表的主键即为主表的ID hibernate.cfg.xml <?xml version=& ...
- ASP.NET Eval四种绑定方式
1.1.x中的数据绑定语法 <asp:Literal id="litEval2" runat="server" Text='<%#DataBinde ...
- 使用eclipse和maven生成java web程序war包
一.eclipse中,在需要打包的项目名上右击,然后把鼠标光标指向弹出框中的“run as”: 二.之后会看到在这个弹出框的右侧会出现一个悬浮窗,如下: 三.在上边的第二个悬浮窗鼠标点击“maven ...