觀察者模式、事件驅動模式一些思考

參考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;
    } 
}
相關文章
相關標籤/搜索