本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/

观察者模式简述

观察者模式的使用非常广泛,常用于建立起一种多对一的关系,该模式一定会包含两个角色,观察者和被观察的对象,当被观察的对象发生变化的时候观察者会接受到相应的通知。

观察者模式的定义与基本结构

定义:定义一个一对多的依赖关系,当被多个对象依赖的那个对象发生改变的时候,所有依赖它的对象都会得到相应的通知并进行状态的更新。

让我们来看一张来自《Head First》的结构图。

aaarticlea/png;base64,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" alt="" />

Subject:被观察对象的接口,只要实现了这个接口,任何类都可以成为被观察的对象,这种面向接口的编程方式让类之间的耦合度降低。

Observer:观察者对象的接口,只要实现了这个接口,任何类都可以成为被观察的对象,这种面向接口的编程方式让类之间的耦合度降低。

ConcreteSubject:实现了Subject接口的具体实例。

ConcreteObserver:实现了Observer接口的具体实例。

注:一对多指的是一个Subject可以被很多observer观察。

一个简单的实例(java)

从观察者更新信息的方式上,可以将观察者模式的实现分成两类,一类是每次Subject更新了信息,Observer都会收到更新的信息(被称为push方式),另一类是每次Subject更新的时候,只通知Observer信息被更新了,但是需要Observer在需要的时候自己来取新的信息(被称为pull方式)。

我们只给出push方式完整的代码,然后文字叙述pull与push实现的区别,感兴趣的朋友可以自己试着实现pull版本。

让我们来考虑这样一个例子,只要我们定了一份新的杂志,每当这份杂志有新的版本的时候,在push方式下,这本杂志就会被送到每一个订阅者的家里,这里发行商就是ConcreteSubject类,顾客是ConcreteObserver类,实现如下。

Subject接口

 public interface Subject {
void addObserver(Observer o);
void deleteObserver(Observer o);
void notifyObserver();
}

Observer接口

 public interface Observer {
void update(String magazine);
}

Publisher类,继承了Subject接口

 public class Publisher implements Subject {
private ArrayList<Observer> customer;
private String magazine;
public Publisher(){
customer=new ArrayList<Observer>();
magazine="";
}
@Override
public void addObserver(Observer o) {
customer.add(o);
System.out.println("新顾客加入");
} @Override
public void deleteObserver(Observer o) {
customer.remove(o);
System.out.println("老顾客退出");
}
@Override
public void notifyObserver() {
for(Observer o:customer){
o.update(magazine);
}
}
public void publishNewMagazine(String magazine){
this.magazine=magazine;
notifyObserver();
}
}

Customer类,继承了Observer接口

 public class Customer implements Observer {
String name;
public Customer(String name){
this.name=name;
}
@Override
public void update(String magazine) {
System.out.println(name+" 拿到了新的杂志 "+magazine) ;
}
}

测试程序如下

 public class Test {
public static void main(String[] args) {
Publisher publisher=new Publisher();
Customer customer1=new Customer("叶良辰");
Customer customer2=new Customer("龙傲天");
publisher.addObserver(customer1);
publisher.addObserver(customer2);
publisher.publishNewMagazine("装B指南");
publisher.deleteObserver(customer1);
publisher.publishNewMagazine("上天秘籍");
}
}

输出如下

aaarticlea/png;base64,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" alt="" />

pull与push主要的区别

1,pull式需要Observer自己去取数据,所以Subject要提供相应的get方法

2,pull式虽然不用主动push数据,但是仍然要在每次更新时告知Observer数据已经更新,所以每一个Observer需要设立一个flag表示自己数据的新旧。

3,object需要判断哪些Observer有权限来取得自己的数据。

(pull方式在那种只有最新信息有价值且Subject更新太快而不适合用push的情况下使用比较好,比如手机上接受天气预报信息之类的)

Java的built-in Observer Pattern

因为观察者模式实在是太常用了,以至于java给我提供了相应的工具直接构建Observer模式,java提供了一个Observable类(作用相当于我们刚刚写的Object,但是这个是类不是接口),和Observer接口,我们只要继承这些类和接口就能直接应用观察者模式了

它们的位置

import java.util.Observable;
import java.util.Observer;

Observer类里有以下成员方法

addObserver(Observer o);//添加observer
clearChanged();//重置更新标志,hasChanged()的返回值将为false
countObservers();//返回observer的数量
deleteObserver(Observer o);//删除一个特定的observer
deleteObservers();//删除所有observer
hasChanged();//测试object的内容距上一次通知后有没有更新
notifyObservers();//如果object内容有更新,调用这个方法会通知所有observer,之后会调用clearChange()方法,这个方法是为pull式实现准备的。
notifyObservers(Object arg);//如果object内容有更新,调用这个方法会将参数中arg的更新推送给所有observer,之后会调用clearChange()方法,这个方法是为push式实现准备的
setChanged();//标明object已经更新

Observer接口里面只有一个update方法,声明如下

public void update(Observable o, Object arg);

第一个参数是被观察的对象,第二个是任何我们想更新给observer的对象,这个对象来自notifyObservers的参数,如果缺失这个参数,表示我们的observer需要自己来拿数据(即pull式实现),如果有这个对象,则属于push式实现。

运用这个java提供的观察者模式的实现我们只需要做两件事。

1,决定使用pull式实现还是push式实现。

2,根据我们的决定实现update方法,如果我们用pull式实现,我们最好在Subject类里提供相应的get方法。

这里给出一个示例,还是上面的例子,仍然是push式,这次我们不用写object与observer接口了。

Customer类

 public class Customer implements Observer {
String name;
boolean newManagzine=false;
public Customer(String name){
this.name=name;
}
@Override
public void update(Observable o, Object arg) {
System.out.println(name+" 拿到了新的杂志 "+arg);
}
}

Publisher类

 import java.util.Observable;
public class Publisher extends Observable {
private String magazine;
public Publisher(){
super();
magazine="";
}
public void publishNewMagazine(String magazine){
setChanged();
this.magazine=magazine;
notifyObservers(magazine);
}
}

test代码完全不用改,输出如下

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWUAAABHCAIAAABQ9MFlAAAIqklEQVR4nO2cUXLrSghEta4sKOvJarKZLMb3471yKQKahmGUxNXny5YYYAZoJXHKx0MIITiOn05ACPFnSPTiOA7wNjIurRpkJNBUtg0/dgnvpJd2e7MrqWJvI+cmNlHTC/eKvUXqxZGRp//d1flFKRzINk2SORDy1u/Xi6jE7QTs2oZn6cVtDOuFO0tkOdsd7yaJvfWGnDQG5wAkhr+IA6V75/2DJXZHvQRsGmdJsq5AxMUcBMOYcrslb3tgjJ89EfVK1DduoHOb7kgY20e9Tg6AHSomxMqkkadKcmmY6rRLGm7DfzI3uurwRte9EqZyS9WPTNfINPi9MJ6jwyQjAssdZ+6WsuHK7SjXz2/oHPHgf75IC5ZOSFrUld5N5SwKYVNl8mRStd2/SS/w6I5PWjTV9srXx5styvtnkkZaOFBxXH2xTkcvouZ2axZ54CEzTK/jEG6epYg4insr8ulu3I0bOSEPMN1slNX5BSrZ18fb28e3t55kuNtPzwocUWlfgmdAL4AluA48lIjmk5+TY1QvgCXT6MAy1RQmMXBc6aHZWLn9RS/+v/DV9HYy5l+LQcp6EVViUS9KHZPSmPkf14vG47Sd2CBJUOfnCysX159csIoxltKLTTQfwsD4UjxSCNp60XtIbtWLKCWsF9Fbd5UbImJlL+m+kqDmbxjuLyPufqMrqUF1X4KnoBdk511eHIQQ4HbhSdeCzrYv2lEiSxAiHYl9ibUPn6ms+X3k8/2kGc/zl178FfKfF9y3wGBxAqstSz3lYMSVbLHNZRg26QV/4K4BE9p1xXizf794PD7fza8k9skE6vg8VVB06cUmqIlyZ4/Ui7R+gw8HfmEpn7aBexSuh7ZeRLOKjRt3z2a2pmGVHb142L944szTwxlsIYFJHkSPuBUi1X++ZfSiev1iw8CsLYVOx6n0OtoLExdnDux7enFJLKr4N7zPRw6jINKLv0LtkZWOGShttaiNkqcOmYEETlIDYNkeiShoz+b8lhEpgLvk7Mr9f63LXzzdg2I6DW9TerGJyd8F+LqS3VlqYsb4BgPXMj2Z9aD3T8hUxJIcMHElFvvQyQohWKQXQggW6YUQgkV6IYRgkV4IIVjm/1DPm40zEnfTn/17S3ofx6xEbC9cOTf8YXMjGbGJLXpBWrqftIMP3lNX5xelcCDzlSSrt36/Xjzt79SL1LP04jb8ro0mAQ9AdaJGyhzliZ33hpw0jk4AHwh/EQdK9877B0vsjnoJ2DSOkyRZVyDiYg6CAfWoPXFQg8atlYqeeyLqlahv3Lhg1yCHas7gltvr5ADYoWJCrExaqTdK3hrTvhJalPh5vVjp2gaX1rSvybjYrOrZHXhGBcDyap48bnUartyKR2KH/VRDix6TelGd/JEyl4KCHfF6QWqZ7f5NeoHLND5p0VTbK/q+39cj1wuyJPwwMEt4SlMENnJU9ALfBSGiA7SH6eaPkzmCoWrvxd3aZWHSGPq+39fih38fSck30Fpr+49vNb4X7RhEHhhLd6iqia0f+DlWbq/v+30tfsXvI/yskjRm/sf1IjqxHYkNkgTV9/2+Flt+viAXYr3gnzakPOF8BscySok/2FQv3BARK3tJ95UE1ff9vhb+GEetBsrAdHy0xBr36p2uAp3tJtOLElmCEOlI7EuMqRRwkizR9/2+Fhv/fpH2UxSo1PfUU47OlonOpHfeOyNJK3rBSx4Q6DSKdcV40/f9vhi1Yy1NIG8/9XwoCU3bCW9webFDL6JjxMaNu2czO5PhlOr7fl+Leb0gn1dptzFjycCsrcYl7/LDzKRdHSRg39OLS2JWBBm90Pf9/mmG9SJqxLSzyYXt9B5mJqPlvT2mlu2RiIL2bM5vSW2NcJecXen7fl+PSb1gxrXqlofp+BsMXMu049eD3j8hUxFLcsDElVjsQycrhGCRXgghWKQXQggW6YUQgkV6IYRgqf2pOf0EpLFqkKnPWdad9PykHw3Mhmuvmlo+69811mcls5Q/msIfqbo24GNUTJ7+d1fnF6VwINs0SeZAyFuvqhe9A7R3cTjXLV8swTCsF1HNqFS6He8mmfbWSBrR2Ke9y7vC0SNW8udplwzfrZ7S+frh6YtkYort/560qXejOXSvM4EavVXtQixS7sCTKnC5FW2QZ31H66tAmfB+GRvRI/x/3mpXHd7oulfCVG6p6JHp2ko3tz0vdjyw3Hrm9+sFvmWvV8sqMOzPF2nbpROSFqzdfIycRSFsqkyeTKp25jfpBdgUDpreTdmhF1Ed8aaiJfzjSjB09CJqbrc8kQceMsP0Og7h5lmKiKO4tyKf7sbduJET8gDTzWLSeoEzxwttbkyBgJPFnYr/GNALYAmuAw8l+P6LYh2jegEsQQjG0h3FamLVoU29lewbeT6CArmnYXchvZilrBfRuS/qhdsEbRoz/+N6sd7x949EIyJZ6LNYuKrhOrncXRdEcaH5EAbGl9rw/cGYuQsbPbFVL6KUsF5Eb91V0TBUT2Nxfnr1She6x2UXui3H94BoUNALsvPSMqeBkpQ5P5FB1FhgmKtRIsueXvBxe4mtHP6KPVjrdo7tQOYYJSKz5D8vuG+BweIElorqzj/TH2A7I2MZdXwaHYSI4vIH7howoSN26EW0i3StLfrK1oQLNVHu7JF6cZkZHCi6QtJ+8pec8AbuUbge2noRjQc2btx1WRQXvBx0YOTKnjP5/BAkicY/TA1cG2v2LA/Wi+r1iw0Ds7YUutTl6etoL0xcnDmwv18vGoW+5AMOMLKsVlak1B5Z6ZiBCqXtXrrbWEIOZNrBTGK4xUuTHwXt2ZzfMiKVLokAuwNJ2utRBzKuqhsUKZO/C6Rd8rxCFq9UY7Ljdxu4lqX56QX9ncOwUujGjvA5/84j+lvoBIUQLNILIQSL9EIIwSK9EEKwSC+EECzSCyEEi/RCCMEivRBCsEgvhBAs0gshBIv0QgjB8g+JL+/Y2wHCegAAAABJRU5ErkJggg==" alt="" />

java给的观察者模式的实现方法其实还有有蛮多的局限性的,比如observable是个类而不是接口,而java是不支持多继承的,所以有了局限性,所以大多数情况下,我们还是自己实现会比较方便。

观察者模式到此结束♪(^∇^*)

参考资料:

1,《Head First 设计模式》

2,在线java API http://tool.oschina.net/apidocs/apidoc?api=jdk_7u4

最新文章

  1. c# 如何中List&lt;object&gt;中去掉object对象中的重复列数据?
  2. 后台调取前台js中的函数
  3. [转] 使用Spring MVC构建REST风格WEB应用
  4. Nginx + tornado + supervisor部署
  5. Light OJ 1296 - Again Stone Game (博弈sg函数递推)
  6. Ajax get方法 IE 下乱码
  7. SQL中的内连接外连接和交叉连接是什么意思?
  8. yiic 数据库迁移工具
  9. unicode下各种类型转换CString、string
  10. 【转】Ubuntu重装,直接进win7,不进linux的解决方案(添加Ubuntu启动菜单)
  11. 标准C++的vector使用
  12. 安卓开发06:布局-线性布局 LinearLayout
  13. 解决IE中placeholder的兼容问题
  14. 消息中间件kafka+zookeeper集群部署、测试与应用
  15. SpringCloud笔记七:Zuul
  16. Jmeter-----参数配置
  17. Java大数练习
  18. 【剑指offer】两个链表的第一个公共结点
  19. 删除SQL Server大容量日志的方法(转)
  20. centos su命令

热门文章

  1. CF451E Devu and Flowers 解题报告
  2. 【luogu 1439 最长公共子序列】
  3. 从零开始学习MXnet(四)计算图和粗细粒度以及自动求导
  4. DIV + CSS问题收集
  5. 搭建eova开发环境
  6. lucene、solr、nutch三者的关系
  7. python 文件操作 r w a
  8. go的websocket实现
  9. 一步步打造自己的linux命令行计算器
  10. Settings点击Location(位置)后右上角的开关button不会消失