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