首页 > 代码库 > 观察者模式、事件驱动模式一些思考

观察者模式、事件驱动模式一些思考

参考http://www.cnblogs.com/zuoxiaolong/p/pattern7.html

 定义:观察者模式(有时又被称为发布-订阅模式、模型-视图模式、源 -收听者模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这 通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。

 简单点概括成通俗的话来说,就是一个类管理着所有依赖于它的观察者类,并且它状态变化时会主动给这些依赖它的类发出通知。

事件监听模式

事件监听模式

 该模式主要由事件源,事件对象,以及事件监听器三元素构成。

 监听器相当于观察者模式中的观察者(Observer),事件源相当于观察者模式中的主题(Subject),事件对象相当于观察者模式中的主题的主题内容(主题是一个类,那么观察者对主题中的莫些属性字段(主题内容)感兴趣,当这些属性值变化了,那么主题通知观察者)

Button是事件源,假设Button现在向拥有点击事件,那么它必须对外开放一个点击行为方法,并拥有点击事件监听器,当Button被点击(点击方法被调用),调用监听器方法,并创建一个点击事件对象传递给监听器。

到这里,观察者与事件监听模式,区别在于观察者中的主题将主题内容从主题中剥离出去,更加抽象解藕。

 

//监听器package java.util;/** * A tagging interface that all event listener interfaces must extend. * @since JDK1.1 */public interface EventListener {}import java.util.EventListener;//点击监听器interface ClickListener extends EventListener{    void click(ClickEvent clickEvent);    }//双击监听器interface DblClickListener extends EventListener{    void dblClick(DblClickEvent dblClickEvent);    }

 

//事件public class EventObject implements java.io.Serializable {    private static final long serialVersionUID = 5516075349620653480L;    /**     * The object on which the Event initially occurred.     */    protected transient Object  source;    /**     * Constructs a prototypical Event.     *     * @param    source    The object on which the Event initially occurred.     * @exception  IllegalArgumentException  if source is null.     */    public EventObject(Object source) {    if (source == null)        throw new IllegalArgumentException("null source");        this.source = source;    }    /**     * The object on which the Event initially occurred.     *     * @return   The object on which the Event initially occurred.     */    public Object getSource() {        return source;    }    /**     * Returns a String representation of this EventObject.     *     * @return  A a String representation of this EventObject.     */    public String toString() {        return getClass().getName() + "[source=" + source + "]";    }}import java.util.EventObject;//按钮事件基类public abstract class ButtonEvent extends EventObject{    public ButtonEvent(Object source) {        super(source);    }    public Button getButton(){        return (Button) super.getSource();    }}//点击事件class ClickEvent extends ButtonEvent{    public ClickEvent(Object source) {        super(source);    }}//双击事件class DblClickEvent extends ButtonEvent{    public DblClickEvent(Object source) {        super(source);    }}
//我们模拟一个html页面的button元素,LZ只添加个别属性,其余属性同理//事件源public class Button {        private String id;//这相当于id属性    private String value;//这相当于value属性    private ClickListener onclick;//我们完全模拟原有的模型,这个其实相当于onclick属性    private DblClickListener onDblClick;//同理,这个相当于双击属性    private MouseMoveListener onm ouseMove;//同理        //按钮的单击行为    public void click(){        onclick.click(new ClickEvent(this));    }    //按钮的双击行为    public void dblClick(){        onDblClick.dblClick(new DblClickEvent(this));    }    //按钮的鼠标移动行为    public void mouseMove(int x,int y){        onm ouseMove.mouseMove(new MouseMoveEvent(this,x,y));    }    //相当于给id赋值    public void setId(String id) {        this.id = id;    }    //类似    public void setValue(String value) {        this.value = http://www.mamicode.com/value;>

 

观察者模式、事件驱动模式一些思考