參考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; } }