什么是观察者模式?
观察者模式是一种一对多的关系,让多个观察者对象同时监听某一个主题对象.这个主题对象发生变化时会通知所有观察者对象,是他们能够更新自己.
为什么要使用观察者模式?
一个或多个对象需要知道一个对象的行为的改变而做出相应的动作的时候就可以使用观察者模式,这样说估计会有点抽象,打个比方,比如说你养了一只小狗,当你看见这只小狗吐舌头的时候就说明他口渴了,你需要喂它喝水.这里你就是观察者,小狗就是主题.笑,懂?
怎么使用观察者模式?
就拿刚才那个例子说事,俺先去画UML类图先
这里我们把Subject(主题)和Observer(观察者)抽象出来,这样我们具体的smalldog依赖抽象的Observer而具体的Master依赖于抽象的Subject。(依赖倒转原则)
下面来看具体代码怎么时间小狗口渴,主人喂水这个操作.
Subject.class
public abstract class Subject {
public abstract void addObserver(MyObserver ob);
public abstract void deleteObserver(MyObserver ob);
public abstract void notifyobserver();
}
MyObserver.class
public interface MyObserver {
public void updata();
}
SmallDog.class
public class SmallDog extends Subject{
private ArrayList<MyObserver> list = new ArrayList<MyObserver>();
@Override
public void addObserver(MyObserver ob) {
// TODO Auto-generated method stub
list.add(ob);
}
@Override
public void deleteObserver(MyObserver ob) {
// TODO Auto-generated method stub
list.remove(ob);
}
@Override
public void notifyobserver() {
// TODO Auto-generated method stub
System.out.println("小狗:我渴了...");
for(MyObserver o : list){
o.updata();
}
}
}
Master.class
public class Master implements MyObserver{
@Override
public void updata() {
// TODO Auto-generated method stub
System.out.println("主人:给小狗喂水...");
}
}
Main.class
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MyObserver observer = new Master();
Subject subject = new SmallDog();
subject.addObserver(observer);
subject.notifyobserver();
}
}
输出结果:
小狗渴了...
给小狗喂水...