1、观察者模式的定义:对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
现实中的例子有很多:比如,订阅的邮件,定时会发送更新的内容;《中国好声音》选秀节目中,一个选手是被观察者,四个导师是观察者,当选手开始唱歌时,四个导师会根据表现进行打分,等等。
2、多的不说,看一下2015中兴移动2015校招笔试题,实现简单,关键是根据自己的理解自定义观察者模式。
package Observer;
import java.util.Enumeration;
import java.util.Scanner;
import java.util.Vector;
/**
* 中兴移动2015笔试题
* 利用观察者模式实现一个数的三倍和平方
* @author USER
*
*/
//观察者接口,实现依赖被观察者的更新操作
interface Observer{
public void update(int num);
}
//实现乘法操作的观察者
class mutiplyObserver implements Observer{
@Override
public void update(int num) {
// TODO Auto-generated method stub
System.out.println("这里观察乘法运算!");
System.out.println(num*3);
}
}
//实现平方操作的观察者
class squareObserver implements Observer{
@Override
public void update(int num) {
// TODO Auto-generated method stub
System.out.println("这里观察平方运算!");
System.out.println(num*num);
}
}
//定义观察者列表类,被观察者用来实现增加、删除、通知观察者操作
class AbstractSubject{
//观察者列表
private Vector<Observer> vector = new Vector<Observer>();
//增加观察者
public void add(Observer observer) {
vector.add(observer);
}
//删除观察者
public void del(Observer observer) {
vector.remove(observer);
}
//通知观察者
public void notify(int num) {
Enumeration<Observer> e = vector.elements();
while (e.hasMoreElements()) {
e.nextElement().update(num);;
}
}
}
//被观察者实现操作
public class Subject extends AbstractSubject{
//实现运算
public void doCalculate(int m) {
System.out.println("通知观察者更新运算");
notify(m);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
//创建一个被观察者
Subject subject = new Subject();
mutiplyObserver mo = new mutiplyObserver();
squareObserver so = new squareObserver();
subject.add(mo);
subject.add(so);
subject.doCalculate(a);
}
}