设计模式之观察者模式、监听者模式

来源:互联网 发布:seo公司哪家好 编辑:程序博客网 时间:2024/06/05 20:26

1、观察者模式:多个对象依赖于一个对象状态的变化,或者说,一个对象的状态变化会“通知”给多个对象,这个时候可以用到观察者模式。

观察者(Observer):被“通知”的对象

被观察者(Subject ):被观察的对象

思想比较简单,就是观察者注册到被观察者,当某个状态改变的时候,被观察者就通知所有观察者

根据依赖倒置原则,设计出得关系图:



参考代码:


/**
 *  观察者
 */

public interface Observer {

/**

* 被通知的时候要做的事在handler里面实现

*/

void handler();

}


/**
 *  2014 下午11:38:15
 *  被观察者
 */

public interface Subject {

/**

* 存放观察者的数组,通知的时候就是遍历这个数组去执行每个观察者的handler方法

*/

List<Observer> observers = new ArrayList<Observer>();

 /**

 * 添加观察自己的观察者

 */

void addObserver(Observer obj);

/**

 * 通知观察者执行它们各自的handler方法

 */

void notifyToObserver();

/**

  * 移除观察自己的观察者

*/

void removeObserver(Observer obj);

}



2、监听者模式,是观察者模式的改进,除了有观察者、被观察在,还有事件源

事件源:观察者观察的事件,一般是一个对象,在观察者和被观察者之间传递一些参数

观察者:事件源发生的时候,执行一些具体操作。一般是listener

被观察者:派发事件的对象


思想:跟观察者模式类似,不同的是,观察者注册到被观察者的时候,需要注册感兴趣的事件,比如update、finished等。


/**
 *  
 *  2014 下午11:55:32
 *  事件源:可以在监听者与被监听者之间传递参数,可以继承它构造需要的具体事件源
 */

public abstract class FutrueEvent {

private Object type;//事件源类型

private Object value;//参数


public FutrueEvent(Object type,Object value){

this.type = type;

this.value = value;

}


}


/**
 *  2014 下午11:53:18
 *  监听者
 */

public interface EventListener<E extends FutrueEvent> {

/**

* 事件触发的时候要做的事在handler里面实现

*/

void handler(E source);

}


/**
 *  
 *  2014 下午11:54:31
 *  事件通知组件
 */

public interface  EventNotifier<T,E extends FutrueEvent> {

/**

* 事件监听者容器:Multimap是特殊的Map,同个key的时候不会覆盖,而是像队列一样添加到同个key上。这样,同个事件源就可以有多个监听者了

*/

private final Multimap<T, EventListener<E>> listeners = LinkedHashMultimap.create();

/**

* 注册监听者

*/

void addListener(T t,EventListener<E> lister);

/**

* 通知所有注册事件t的监听者

*/

void notifyListener(T t);

/**

* 移除事件

*/

void removeListener(T t);


}


注意:要保证addListener和notifyListener的事件通知事件是同个对象,不然通知派发不出去的。


0 0