从字面意义上看:Observer观察者,Observable可观察的。当然是观察者对可观察的对象进行观察。乍一看,这观察没什么难的,用普通的 if 语句就可以实现这个功能,但其实这里的Observer Pattern是有一些很好的优点的。
看程序前,先通过API对Observer Pattern进行最基本,最准确的认识和理解。
----------------------------------------------------------------------------------------------------------------------------------
先看java.util.Observable,不要被其名字所误导(因为名字看起来像个interface,如接口comparable就是这样类型的名字),它其实是一个类。如果想让某个类被观察,只要将这个类继承Observable就行了。
其主要的方法有:
void addObserver(Observer o) ---添加观察者
boolean hasChanged() ---测试对象是否改变
protected void setChanged() ---标记此Observable对象为已改变对象;此时hasChanged()返回true
void notifyObservers(Object arg) ---如果hasChanged()方法指示对象已改变,则通知其所有观察者,并调用clearChanged()方法指示此对象不再改变。
protected void clearChanged() ---指示对象不再改变,所以此时hasChanged()返回false
----------------------------------------------------------------------------------------------------------------------------------
再看java.util.Observer,它是一个接口。实现这个接口的类,可以对Observable对象进行观察。
其主要的方法有:
void update(Observable o, Object arg) ---当调用Obserbable对象的notifyObservers时,此方法作出响应。
----------------------------------------------------------------------------------------------------------------------------------
讲一个实例:
程序结构是这样的:
import java.util.Observable;
public class Product extends Observable
{
private String name;
private double price;
public Product()
{
String defaultName ="default name";
name = defaultName;
double defaultPrice = 100;
price = defaultPrice;
}
public void setName(String currentName)
{
System.out.println("Previous name is:"+name);
name=currentName;
setChanged();
System.out.println("Now the method hasChanged() return:"+hasChanged());
notifyObservers(currentName);
System.out.println("Now the method hasChanged() return:"+hasChanged()+"\n\n");
}
public void setPrice(double currentPrice)
{
System.out.println("Previous price is:"+price);
price=currentPrice;
setChanged();
System.out.println("Now the method hasChanged() return:"+hasChanged());
notifyObservers(currentPrice);
System.out.println("Now the method hasChanged() return:"+hasChanged()+"\n\n");
}
}
import java.util.Observer;
import java.util.Observable;
public class PriceObserver implements Observer
{
public void update(Observable o,Object arg)
{
if(arg instanceof Double)
System.out.println("Name changed to :"+arg);
}
}
import java.util.Observer;
import java.util.Observable;
public class NameObserver implements Observer
{
public void update(Observable o,Object arg)
{
if(arg instanceof String)
System.out.println("Name changed to :"+arg);
}
}
还有最后一个是测试类:
public class Tester
{
public void test()
{
Product pro = new Product();
pro.addObserver(new NameObserver());
pro.addObserver(new PriceObserver());
System.out.println("The class Product has "+pro.countObservers()+" Observers.\n");
pro.setName("NEW NAME");
pro.setName("ANOTHER NEW NAME");
pro.setPrice(200);
pro.setPrice(300);
}
}
程序的输出结果如下:
程序运行的主线流程是这样的:
1. 为Product 的对象添加观察者,pro.addObserver(new NameObserver());
2.由于setName方法中设置了观察点(setChanged(); )
所以,当Product 的对象发生改变时候,pro.setName("NEW NAME");
会触发 notifyObservers(currentName);)这个方法是以setChanged()为基础的,或者说是以hasChanged()为
基础的,因为setChanged()改变hasChanged()的返回值!
3.调用Observer接口类中的update方法,是该类作出响应(NameObserver)。
响应是:System.out.println("Name changed to :"+currentName);
接下来,看看这种Pattern的特殊之处。
以前,如果想实现一个类内部的观察监督,理论上是要用if语句(其实我觉得对于一个类来说,这样更好),但是有时候是要实现一个类改变,引发其他类跟着改变的!
这是,如果想要观察者类发生改变,就需要在被观察对象的代码中创建观察者的实例。这样就出现了调用的情况,耦合性加大了。
此时,如果应用Observer Pattern,便会降低耦合性,符合高内聚,低耦合的设计原则。
此外,Observer Pattern 还有如下特点(由于使用太少,经验不多,所以摘除网上内容,便以后深入理解):
----------------------------------------------------------------------------------------------------------------------------------
优点:
是实现了表示层和数据逻辑层的分离,并定义了稳定的更新消息传递机制,类别清晰,并
抽象了更新接口,使得可以有各种各样不同的表示层(观察者)。
1、 Subject和Observer之间是松偶合的,分别可以各自独立改变,不互相依赖。
2、 Subject在发送广播通知的时候,无须指定具体的Observer,Observer可以自己决定是否要订阅Subject的通知。
3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。
缺点:
1、如果一个被观察者对象有很多直接和间接的观察者的话,将所有的观察者都通知到会
花费很多时间。
2、如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致
系统崩溃。在使用观察考模式时要特别注意这一点。
3、如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自
恰的方式进行的。
4、虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没
有相应的机制使观察者知道所观察的对象是怎么发生变化的。
form:http://mynamesky.iteye.com/blog/450194
----------------------------------------------------------------------------------------------------------------------------------
分享到:
相关推荐
从Observer到Observable:使用Functional Swift提升复杂iOS项目的可维护性
从Observer到Observable:使用Functional Swift提升复杂iOS项目的可维护性.pdf
这是最简单的一个MVC实例,通过它你可以了解MVC的基本工作原理。
观察者模式介绍:Observable和Observer原理分析,手动实现简单MyObservable和MyObserver
Java内置的Observable类和Observer接口提供了基本的观察者模式功能,你可以通过继承Observable类和实现Observer接口来使用
NULL 博文链接:https://best-sheng.iteye.com/blog/1024369
这个现在对人来说都是相当特定的 - 理想情况下它应该支持 ES7 observable 接口,但这是有效的。 请参阅的讨论。去做 测试 可运行的例子 包含invariant用法在 DOM 元素上使用它。 import observer from 'react-...
observer观察者模式
主要介绍了 Java观察者设计模式(Observable和Observer)的相关资料,需要的朋友可以参考下
在多年的图像处理工作中, 深感有必要自己开发一个开发一个集图像的显示, 变换, 各种处理分析测试的工具平台, 这就是Observer. 取名为Observer, 是因为我觉得图像的处理与分析依赖于对图像的细致观察. Observer的...
意法半导体公司关于电机控制器的源代码程序,此为其中的观测器源代码
SQLiteDatabase,SQLiteOpenHelper,ContentProvider,ContentResolver,ContentObserver,ContentObserverable的使用简单使用。
NULL 博文链接:https://gary0416.iteye.com/blog/909427
C++、MFC源代码observer
Observer设计模式是一种经典的设计模式,在GOF 23种设计模式种 比较常用于实际。主要是有类指针传递并引用方法和消息传递响应的方法来实现。
关于observer的使用案例,详情请看http://blog.csdn.net/jan_s/article/details/47009171
设计模式之观察者模式ObserverPattern
禅宗可观察 Observables for JavaScript的... let observable = new Observable ( observer => { // Emit a single value after 1 second let timer = setTimeout ( ( ) => { observer . next ( 'hello' ) ; obs
Adaptive observer and sliding mode observer based actuator fault diagnosis for civil aircraft
Luenberger observer matlab simulink simulation