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

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

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

 简单点归纳成通俗的话来讲,就是一个类管理着全部依赖于它的观察者类,而且它状态变化时会主动给这些依赖它的类发出通知。设计模式

事件监听模式函数

事件监听模式this

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

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

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

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

 

//监听器
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 onMouseMove;//同理
    
    //按钮的单击行为
    public void click(){
        onclick.click(new ClickEvent(this));
    }
    //按钮的双击行为
    public void dblClick(){
        onDblClick.dblClick(new DblClickEvent(this));
    }
    //按钮的鼠标移动行为
    public void mouseMove(int x,int y){
        onMouseMove.mouseMove(new MouseMoveEvent(this,x,y));
    }
    //至关于给id赋值
    public void setId(String id) {
        this.id = id;
    }
    //相似
    public void setValue(String value) {
        this.value = value;
    }
    //这个至关于咱们在给onclick添加函数,即设置onclick属性
    public void setOnclick(ClickListener onclick) {
        this.onclick = onclick;
    }
    //同理
    public void setOnDblClick(DblClickListener onDblClick) {
        this.onDblClick = onDblClick;
    }
    //同理
    public void setOnMouseMove(MouseMoveListener onMouseMove) {
        this.onMouseMove = onMouseMove;
    }
    //如下get方法
    public String getId() {
        return id;
    }
    
    public String getValue() {
        return value;
    }
    
    public ClickListener getOnclick() {
        return onclick;
    }
    
    public DblClickListener getOnDblClick() {
        return onDblClick;
    } 
}
相关文章
相关标签/搜索