您的位置:首页 > 其它

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

2017-06-15 15:08 405 查看
参考http://www.cnblogs.com/zuoxiaolong/p/pattern7.html

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

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

[b]事件监听模式[/b]

[b][b][b]事件监听模式[/b]:[/b][/b]

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

监听器相当于观察者模式中的观察者(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 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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: