先简单介绍一下观察者模式:在对象之间定义一对多的依赖,这样当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。
相信大家对回调都非常熟悉了,这里可以把回调看作是观察者模式的一种特殊类型,即只有一个观察者。
下面用图来描述一下观察者和被观察者之间的关系:
�张三,赵四,王五都订了牛奶。送奶工过来后通知他们过来取奶,这时某六看到,也想订奶,就和送奶工说以后也给我送。之后送奶工就给他们四人送奶。
某天张三不想喝奶了,就和送奶工说我不喝了,以后别给我送了。之后送奶工就只给赵四,王五,赵六送奶了
图画的不好,请大家忍住别笑,下面说一下送奶工(被观察者)的工作流程。
在这里张三,赵四,王五,某六都是观察者。在第一幅图片中某六并没有订奶,所以没有收到送奶工的通知。于是它和送奶工说我也要喝牛奶,就订阅了。
之后送奶工就给四个人送奶并通知他们。某天张三不想喝奶了,就告诉送奶工说我不想喝牛奶了,以后别送了。这时他就取消了订阅,之后送奶工就不再通知张三过来取奶了。
好了,图片介绍完了,下面上代码。
在这里将被观察者抽象为一个接口,这样当这个送奶工哪天不想做了的时候,我们可以立刻换个送奶工代替他去工作:
public interface Subject {
//注册观察者
void registerObserver(MyOberver o);
//移除观察者
void removeObserver(MyOberver o);
//通知观察者
void notifyObservers();
}
接下来定义观察者的接口,这里只有一个方法,取奶:
public interface MyOberver {
//取奶
void getMilk();
}
接下来,让送奶工 A实现subject:
public class A implements Subject {
//创建一个集合,管理观察者
private List<MyOberver> observers;
public A(){
observers = new ArrayList<>();
}
@Override
public void registerObserver(MyOberver o) {
//每注册一个观察者�,将他加入观察者集合中
observers.add(o);
}
@Override
public void removeObserver(MyOberver o) {
//获得观察者在集合中的索引,并移除
int i = observers.indexOf(o);
if ( i >= 0){
observers.remove(i);
}
}
@Override
public void notifyObservers() {
//遍历集合中的观察者,并通知他们取奶
for(int i = 0; i < observers.size(); i++){
MyOberver oberver = observers.get(i);
oberver.getMilk();
}
}
}
然后定义被观察者:
public class Observer implements MyOberver {
private Subject milkStuff;
private String name;
public Observer(Subject milkStuff,String name) {
this.milkStuff = milkStuff;
//在构造方法中将当前对象注册当观察者集合中
milkStuff.registerObserver(this);
this.name = name;
}
@Override
public void getMilk() {
System.out.println("我是" + name + ",马上来取奶...");
}
}
最后写一个main方法测试就ok啦
public static void main(String[] args) {
A milkStuff = new A();
MyOberver zs = new Observer(milkStuff,"张三");
MyOberver ls = new Observer(milkStuff,"李四");
MyOberver ww = new Observer(milkStuff,"王五");
MyOberver ml = new Observer(milkStuff,"某六");
milkStuff.notifyObservers();
}
在这里我只是简单的阐述了观察者模式的原理,帮助大家弄懂这种优秀的设计模式。真正应用起来肯定会比这个例子复杂的多。
希望自己在成为大牛的路上愈行愈远,与大家共勉
�