设计模式学习总结-观察者模式

定义

Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。

从这段话里我们可以得到两个信息,如下:

1 观察者(具体执行操作的对象,有多个)
2 被观察者(顾名思义是被观察的对象,如果该对象发生某些变化则通知观察者执行对应的操)

UML图

代码实例

下面展示了一个简单的观察者模式,或者说监听器的实现。Subject对象集成了Observable抽象类,具有的加入监听器的功能,同时当其执行业务逻辑时,即出发监听器,各个监听器均执行update方法。

Observer 接口:

public interface Observer {  
 
    void update(Observable o);
}

Observer接口的实现一——JMS监听器:

public class JMSObserver implements Observer{  
 
    public void update(Observable o) {
        System.out.println("发现操作!启动JMS通知预警!");
    }
}

Observer接口的实现二——邮件监听器:

public class MailObserver implements Observer{  
 
    public void update(Observable o) {
        System.out.println("发现操作!启动Mail邮件通知预警!");
    }
}

Observable抽象类:

public class Observable {
 
	private Vector obs;
 
	/**
	 * 创建被观察者时就创建一个它持有的观察者列表,注意,这个列表是需要同步的。
	 */
	public Observable() {
		obs = new Vector();
	}
 
	/**
	 * 添加观察者到观察者列表中去
	 */
	public synchronized void addObserver(Observer o) {
		obs.addElement(o);
	}
 
	/**
	 * 删除一个观察者
	 */
	public synchronized void deleteObserver(Observer o) {
		obs.removeElement(o);
	}
 
	/**
	 * 通知操作,即被观察者发生变化,通知对应的观察者进行事先设定的操作
	 */
	public void notifyObservers() {
		Iterator iter = obs.iterator();
		while(iter.hasNext()){
			Observer observer = iter.next();
			observer.update(this);
		}
	}
}

实际对象,继承自Observable抽象类:

public class Subject extends Observable{  
 
    /**
     * 业务方法,一旦执行某个操作,则通知观察者
     */
    public void doBusiness(){
        System.out.println("我们干正事,执行操作啦");
        notifyObservers();
    }  
 
}

测试主方法:

	public static void main(String[] args) {
        //创建一个被观察者
        Subject subject = new Subject();  
 
        //创建两个观察者
        Observer mailObserver = new MailObserver();
        Observer jmsObserver = new JMSObserver();  
 
        //把两个观察者加到被观察者列表中
        subject.addObserver(mailObserver);
        subject.addObserver(jmsObserver);  
 
        //执行业务操作
        subject.doBusiness();
	}

输出:

我们干正事,执行操作啦
发现操作!启动Mail邮件通知预警!
发现操作!启动JMS通知预警!

Leave a Comment.