1、观察者模式
观察者(Observer)模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。Observer模式提供给关联对象一种同步通信的手段,使得莫哥对象与依赖它的其他对象之间保持状态同步。
2、结构与角色
老规矩,我们先看看观察者模式的结构示意图示,如下:
在这里,我们看到四个角色,而实际上归类起来,观察者模式只有两个对象,一个是观察者,一个是被观察者。但是在我们的设计模式当中,进行了封装和抽象等可扩展的操作,所以上面两个角色对象又被细分为四种对象,如下:
抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。(Subject)
抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。(Observer)
具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。(ConcreteSubject)
具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。(ConcreteObserver)
3、代码示例
观察者模式的代码比较简单,只有一个具体的主题和具体的观察者,如下:
import java.util.Observable;
public class Person extends Observable {
private String name ;
private String sex ;
private int age ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
this.setChanged();
this.notifyObservers();
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
this.setChanged();
this.notifyObservers();
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
this.notifyObservers();
this.setChanged();
}
}
观察者如下:
import java.util.Observable;
import java.util.Observer;
public class MyObserver implements Observer{
public void update(Observable observable,Object object){
System.out.println("对象发生变化。。。。。。。");
}
}
测试如下:
public class MainClass {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person person = new Person();
//注册观察者
// 侦听事件驱动程序设计中的外部事件
// 侦听某个对象的状态变化
// 新的产品出现,消息通知,邮件列表中的订阅者
person.addObserver(new MyObserver());
person.setName("张三");
}
}
4、总结分析
分析,虽然上面我们只有两个类,但实际上,观察者模式还是四个对象,我们这里使用了Java的jdk,它帮我们写好了接口信息,我们直接使用就行了,读者要区分对待。