观察者模式定义:在对象之间定义一对多的关系,当主对象改变状态,依赖它的对象都会收到通知,作出相应的改变。
这种模式在现实中比较常见:比方说,炒股的过程中,股票行情可以当做主对象,股票玩家就是模式中的观察者。当股票行情变化时,炒股者观察或者监听到行情的变化,就会作出买,卖的行为。
再比方说,有一个猎头,有一群求职者是他的客户,猎头从委托公司获取职位信息,一旦获取到新的职位需求,就会逐个通知他的客户,让他们准备去面试。猎头就是模式中的主对象,各个求职者组成模式中的观察者。
UML如下:
![](https://img.haomeiwen.com/i13993199/a84dbdff8f240652.png)
观察者模式中角色如下:
1、主体接口(HeadHunter),这个接口是主体类的抽象。一般,对观察者的添加,删除都在里面定义,包括状态更新后通知观察者的方法。
2、主体类(ConcreteHeadHunter),这个是主体接口的一个具体实现,主体类中会维护一个观察者的列表。主体类负责维护观察者的增,减和状态变更通知。
3、观察者接口(Observer),各种类型的观察者的一个抽象,用于规范所有观察者的共有行为。
4、具体的观察者类(FirstObserver、SecondObserver),主体类变化之后,会通知各个观察者,各个观察者更具变化执行自己的操作
代码如下:
/**
* 模式中主体类的接口,观察者的维护和通知都在此处定义
* @author saisaimayi
*
*/
public interface HeadHunter {
/**
* 注册观察者
* @param observer
*/
public void registerObserver(Observer observer);
/**
* 删除观察者
* @param observer
*/
public void removeObserver(Observer observer);
/**
* 更新工作
*/
public void updateJob();
/**
* 通知所有观察者
*/
public void notifyObservers();
}
/**
* 具体的主体类
* @author saisaimayi
*
*/
public class ConcreteHeadHunter implements HeadHunter {
private List<Observer> observerList = new ArrayList<Observer>();
public void registerObserver(Observer observer) {
observerList.add(observer);
}
public void removeObserver(Observer observer) {
observerList.remove(observer);
}
public void updateJob() {
System.out.println("来了一个新工作,我要通知那些找工作的家伙...");
notifyObservers();
}
public void notifyObservers() {
//逐个通知观察者
for (Observer observer : observerList) {
observer.interview();
}
}
}
/**
* 观察者接口,定义所有观察者的共用行为
* @author saisaimayi
*
*/
public interface Observer {
public void setName(String name);
/**
* 参加面试
*/
public void interview();
}
/**
* 求职者一(观察者)
* @author saisaimayi
*
*/
public class FirstObserver implements Observer {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void interview() {
System.out.println(name+" prepare to interview...");
}
}
/**
* 求职者二(观察者)
* @author saisaimayi
*
*/
public class SecondObserver implements Observer {
private String name = "Frank";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void interview() {
System.out.println(name+" prepare to interview...");
}
}
public class Client extends TestCase {
public void test(){
HeadHunter hunter = new ConcreteHeadHunter();
Observer javadev = new FirstObserver();
javadev.setName("Jack");
Observer cdev = new SecondObserver();
hunter.registerObserver(javadev);
hunter.registerObserver(cdev);
hunter.updateJob();
}
}
网友评论