观察者模式也是比较简单的一种模式,可能从名字上理解无法明白,但真正理解其含义之后就非常简单了,说实话在自己来发的项目中自己也用到过,只不过不知道它叫观察者罢了,只要懂面向对象的对继承多态理解很深的,玩观察者模式很随意就能用到项目中去。
这本书用一个很形象的故事解释了观察者模式,故事情景:公司员工当老板不在时有的炒股有的看NBA,为了防止老板偷袭,让前台MM通知。即前台MM充当了观察者,而员工属于具体的实例对象了。我们要编写的代码就是MM作为通知类,员工作为被通知者,
观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同事监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
如何实现呢?请看代码吧
1、观察者接口(定义所有观察者的属性,在此不一定就是前台MM通知)
/**
* @author jzhf
* 2014-10-31
* 通知类
*/
public interface Subject {
public abstract void add(Observer observer);
public abstract void notifyEveryOne();
public final String message = "老板来了";
}
2、前台MM继承观察者接口(因为它要把风)
/**
* @author jzhf
* 2014-10-31
* 秘书通知大家老板来了
*/
public class Secretary implements Subject{
private List<Observer> list = new ArrayList<Observer>();
/* (non-Javadoc)
* @seecom.test.model.observer.Subject#notifyEveryOne()
* 通知每一个人
*/
public void notifyEveryOne(){
// TODO Auto-generatedmethod stub
for(Observer observer : list){
observer.Update();
}
}
/* (non-Javadoc)
* @seecom.test.model.observer.Subject#add(com.test.model.observer.Observer)
*/
public void add(Observer observer) {
// TODO Auto-generatedmethod stub
list.add(observer);
}
}
3、还有一个通知大家的就是老板了(老板来了直接对他们说别玩了工作吧),和前台类一样,在此略(只是类名不同而已,本人定义的类名是Boss)
4、开始定义具体类了,有的员工在看股票,有的看NBA,所以要用抽象类定义共同的动作了。
/**
* @author jzhf
* 2014-10-31
* 对观察者即工作时间玩其他的人的抽象类
*/
public abstract class Observer {
public String name;
public Subject sub;
public Observer(String name,Subject sub){
this.name = name;
this.sub = sub;
}
public abstract void Update();
}
5、看股票的
/**
* @author jzhf
* 2014-10-31
*/
public class StockObserver extends Observer{
public StockObserver(String name,Subject sub){
super(name, sub);
}
/* (non-Javadoc)
* @seecom.test.model.observer.Observer#Update()
*/
@Override
public void Update() {
// TODO Auto-generatedmethod stub
System.out.print(sub.message+this.name+"关闭股票行情,继续工作");
}
}
6、看NBA的
/**
* @author jzhf
* 2014-10-31
*/
public class NBAObserver extends Observer{
public NBAObserver(String name,Subject sub){
super(name, sub);
}
/* (non-Javadoc)
* @seecom.test.model.observer.Observer#Update()
*/
@Override
public void Update() {
// TODO Auto-generatedmethod stub
System.out.println(sub.message+this.name+"关闭NBA,继续工作");
}
}
7、客户端
/**
* @author jzhf
* 2014-10-31
*/
public class ObserverClient {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generatedmethod stub
//秘书通知
Subject sub = new Secretary();
Observer observer = new StockObserver("老李", sub);
sub.add(observer);
Observer observer2 = new NBAObserver("老王", sub);
sub.add(observer2);
sub.notifyEveryOne();
//老板通知
Subject sub2 = new Boss();
Observer observer3 = new StockObserver("老李", sub);
sub2.add(observer3);
Observer observer4 = new NBAObserver("老王", sub);
sub2.add(observer4);
sub2.notifyEveryOne();
}
}
如果你看完程序我相信你已经理解了观察者模式了,观察者模式所做的工作其实就是解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。
附上观察者模式结构图
总结:当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。当系统中一个对象依赖于另一个对象,这时用观察者模式可以将这两个封装在独立的对象中使用它们各自独立地改变和复用。