1.介绍
观察者模式(Observer Pattern)是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。属于类和类之间的关系,不涉及到继承,学习设计模式的时候应该记得归纳比较。
在实际生活中,比如我们乘坐卧铺,上车之后负责该车间的乘务人员会将你的卧铺票兑换成对应床铺的卡片,在快下车的时候,乘务人员会根据自己小本本上的卧铺车票过来通知你要下站了,这个过程中,乘客就是观察者,乘务人员是被观察者,实现的关键就是乘务人员手中的小本本,也就是代码中的ArrayList集合或者Vector集合。
2.代码示例
我们先创建一个乘客接口:
package com.tl.skyLine.pattern.ObserverPattern;
/**
* Created by tl on 17/3/10.
*/
public interface Observer {
void prepare();
}
实现两个具体的乘客,金刚狼Observer2和死侍Observer1:
package com.tl.skyLine.pattern.ObserverPattern;
/**
* Created by tl on 17/3/10.
*/
public class Observer1 implements Observer {
@Override
public void prepare() {
System.out.println("死侍停止吧嗒吧嗒说话,准备下车!");
}
}
package com.tl.skyLine.pattern.ObserverPattern;
/**
* Created by tl on 17/3/10.
*/
public class Observer2 implements Observer {
@Override
public void prepare() {
System.out.println("金刚狼收起钛合金钢爪,准备下车!");
}
}
火车上的乘务人员:
package com.tl.skyLine.pattern.ObserverPattern;
/**
* 乘务人员,观察者模式中被观察者
* Created by tl on 17/3/10.
*/
public interface Crew {
/*增加观察者*/
void add(Observer observer);
/*删除观察者*/
void del(Observer observer);
/*通知所有的观察者*/
void notifyObservers();
/*自身的操作*/
void operation();
}
乘务人员有很多方法,其中新增,删除,通知方法做的事是一样的,只有operation方法是不同的,比如有的乘务人员喜欢四处溜达,有的喜欢坐在自己的小房间里,还有的要出去卖东西赚外快, 等等等,所以我们先实现一个抽象类:
package com.tl.skyLine.pattern.ObserverPattern;
import java.util.Enumeration;
import java.util.Vector;
/**
* Created by tl on 17/3/10.
*/
public abstract class AbstractCrew implements Crew {
private Vector<Observer> vector = new Vector<Observer>();
@Override
public void add(Observer observer) {
vector.add(observer);
System.out.println("新增一位卧铺乘客提醒信息!");
}
@Override
public void del(Observer observer) {
vector.remove(observer);
System.out.println("乘客已经下车!");
}
@Override
public void notifyObservers() {
Enumeration<Observer> enumo = vector.elements();
while (enumo.hasMoreElements()) {
enumo.nextElement().prepare();
}
}
}
具体16号车厢的乘务人员:
package com.tl.skyLine.pattern.ObserverPattern;
/**
* 16号车厢的乘务员
* Created by tl on 17/3/10.
*/
public class Crew16 extends AbstractCrew {
@Override
public void operation() {
System.out.println("漫长的旅途,如此无聊,我先来几局王者农药吧!");
notifyObservers();
}
}
测试:
package com.tl.skyLine.pattern.ObserverPattern;
/**
* Created by tl on 17/3/10.
*/
public class ObserverTest {
public static void main(String[] args) {
//创建被观察者
Crew crew = new Crew16();
//创建观察者1
Observer1 observer1 = new Observer1();
//创建观察者2
Observer2 observer2 = new Observer2();
crew.add(observer1);
crew.add(observer2);
crew.notifyObservers();
crew.del(observer1);
crew.del(observer2);
}
}
输出:
新增一位卧铺乘客提醒信息!
新增一位卧铺乘客提醒信息!
死侍停止吧嗒吧嗒说话,准备下车!
金刚狼收起钛合金钢爪,准备下车!
乘客已经下车!
乘客已经下车!
很明显可以看到,乘客上车信息,到站之后,通知换票下车的完整个过程。
另外附一张从其它地方看到的观察者模式的关系图片: