(六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型) (九)

2014-11-24 10:41:13 · 作者: · 浏览: 15
nds ButtonEvent{

public ClickEvent(Object source) {
super(source);
}

}
//双击事件
class DblClickEvent extends ButtonEvent{

public DblClickEvent(Object source) {
super(source);
}

}
//鼠标移动事件
class MouseMoveEvent extends ButtonEvent{
//鼠标移动事件比较特殊,因为它需要告诉监听器鼠标当前的坐标是在哪,我们记录为x,y
private int x;
private int y;

public MouseMoveEvent(Object source, int x, int y) {
super(source);
this.x = x;
this.y = y;
}

public int getX() {
return x;
}

public int getY() {
return y;
}

}

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);
}

}
//鼠标移动事件
class MouseMoveEvent extends ButtonEvent{
//鼠标移动事件比较特殊,因为它需要告诉监听器鼠标当前的坐标是在哪,我们记录为x,y
private int x;
private int y;

public MouseMoveEvent(Object source, int x, int y) {
super(source);
this.x = x;
this.y = y;
}

public int getX() {
return x;
}

public int getY() {
return y;
}

}
以上是三种事件,都非常简单,只有鼠标移动需要额外的坐标,下面给出三种监听器。

[java]
import java.util.EventListener;
//点击监听器
interface ClickListener extends EventListener{

void click(ClickEvent clickEvent);

}

//双击监听器
interface DblClickListener extends EventListener{

void dblClick(DblClickEvent dblClickEvent);

}

//鼠标移动监听器
interface MouseMoveListener extends EventListener{

void mouseMove(MouseMoveEvent mouseMoveEvent);

}

import java.util.EventListener;
//点击监听器
interface ClickListener extends EventListener{

void click(ClickEvent clickEvent);

}

//双击监听器
interface DblClickListener extends EventListener{

void dblClick(DblClickEvent dblClickEvent);

}

//鼠标移动监听器
interface MouseMoveListener extends EventListener{

void mouseMove(MouseMoveEvent mouseMoveEvent);

} 三种监听器分别监听点击,双击和鼠标移动。下面给出我们最重要的类,Button。

[java]
//我们模拟一个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(MouseMove