通过场景模拟实现观察者模式
观察者模式可以一步步来实现,首先写一个observable(被观察者)接口和一个observer(观察者)接口。
如下 :
Observable(被观察者)接口
public interface Observable { void addObserver(Observer observer); void deleteObserver(Observer observer); void notifyObservers(String message); }
三个方法的功能分别为添加观察者,删除观察者,以及通知观察者
Observer(观察者)接口
public interface Observer { void getMessage(String message); }
这个getMessage()方法用于接收 '被观察者' 发出的信息,里面的message就是 '被观察者' 向 观察者 发出的消息
具体的使用我们可以结合到场景中来,比如现在有如下一个场景:
一个屋子里有个人(Master)正在睡觉,他养了一只猫(Cat)名字叫 tom,tom 在主人睡觉时突然看到了老鼠 jerry 在偷吃食物,于是它大声“喵~~”了一声,jerry 听到了猫叫声,吓得拔腿就跑,而睡觉的主人也被tom的叫声吵醒了,想要训斥它。
上面的场景我们很容易就能分析出 猫是被观察者,被它的叫声吓跑的老鼠和主人都属于观察者。
我们可以先建这三个类
猫
public class Cat implements Observable{ private List<Observer> lists=new ArrayList<Observer>(); public void miao(){ this.message="喵~~"; System.out.println(message); notifyObservers(message); } @Override public void addObserver(Observer observer) { this.lists.add(observer); } @Override public void deleteObserver(Observer observer) { this.lists.remove(observer); } @Override public void notifyObservers(String message) { for(Observer observer:this.lists){ observer.getMessage(message); } } }
猫这个类中首先创建了一个集合用于存储所有对猫进行观察的观察者,在上述场景中,就是人和老鼠这两个对象。
猫还自带了一个方法miao()用于发出叫声,并且调用了notifyObservers()方法通知所有的被观察者。
剩下的三个方法就是实现Observable接口中的方法,添加观察者,删除观察者,以及通知观察者,注意最后的notifyObsevers()中先是从list中遍历取出观察者,再调用观察者的getMessage()方法,把消息发送给观察者。
接着写老鼠类
public class Mouse implements Observer{ @Override public void getMessage(String message) { run(message); } //老鼠开始逃跑 public void run(String message){ System.out.println(" 我听到了 "+message+" ,快跑啊!猫来啦!!"); } }
Mouse类里面先是实现了Observer接口中的getMessage()方法,然后在getMessage()方法中调用了run()方法,表示老鼠听到猫叫声,开始逃跑。
还有一个主人类
public class Master implements Observer{ @Override public void getMessage(String message) { awake(message); } public void awake(String message){ System.out.println(" 笨猫, 别打扰我睡觉!!"); } }
主人类的实现基本上和老鼠类相同,awake()方法表示主人被猫吵醒,然后责骂猫
几个具体类都写完,下面可以开始真正的场景了
public class Context { public static void main(String[] args) {
//tom猫 Cat tom=new Cat(); //主人 Master master=new Master(); //老鼠jerry Mouse jerry=new Mouse(); tom.addObserver(jerry); tom.addObserver(master); tom.miao(); } }
执行的结果如下:
喵~~ 我听到了 喵~~ ,快跑啊!猫来啦!! 笨猫, 别打扰我睡觉!!
总结:我们平时写代码经常会使用函数回调,其实回调机制的实现思路就是观察者模式,只不过通常我们都是使用了简化版的观察者模式来实现回调。所以了解掌握观察者模式可以帮助我们更好的去使用接口回调。