内部匿名类、事件监听、回调、Observer模式
在和界面相关的开发中,经常会使用内部匿名类实现事件监听。而内部匿名类的好处是很容易实现回调,配合使用观察者模式,可以很方面的事件监听模型。例子如下:
//界面类
public class TestViewer extends TreeViewer {
Model model;
//构造函数
public TestViewer(final Composite parent, int style, Model model) {
super(parent,style);
this.model = model;
//内部匿名类,注册一个model的事件
md.addListener(new ModelListener() {
public void modelChanged(final Node obj) {
TestViewer.this.add(obj);//回调
}
});
}
//绘制界面,把获得的Node对象绘制到界面中
public void add(Node node){
}
}
//模型类
public class Model{
private List listeners = new ArrayList();//定义监听器数组
public void createNode(String name) throws InterruptedException {
SessionTreeNode tt=null;
try{
Node node=new Node(name);
}finally{
modelChanged(node);
}
}
//新增监听
public void addListener(ModeChangedListener listener) {
listeners.add(listener);
}
//调用所有的监听程序
public void modelChanged(Node node){
Object[] ls = listeners.getListeners();
for(int i=0;i<ls.length;++i){
try{
((ModeListener)ls[i]).modelChanged(node);
}catch(Throwable e){
}
}
}
}
//模型类中使用到的一个结点
public class Node{
public Node(String name){
}
}
//定义监听器借口
public interface ModelListener {
void modelChanged(Node node);
}
调用过程:
1.在应用上下文中新建一个Model: Model model = new Model();
如果是做插件程序,可以把model放在Plugin类中
2.当应用程序初始化时,会 new TestViewer(composite,style,model);
注意model此时被传入。当然model也可以保存在上下文中
3.在界面中引发一个事件,会调用model.createNode("node");
此时会调用所有的监听程序(Observer模式),它将执行回调用程序 TestViewer.this.add(obj);
于是,node将会被画到View上
4.可以把程序入口抽象到一组Action中,那就形成了一个MVC模式:程序入口就是C,Model就是M,View就是V
总结:使用以上技术,将模式和Java语言充分结合,可以很方面实现自己的事件监听模型
在和界面相关的开发中,经常会使用内部匿名类实现事件监听。而内部匿名类的好处是很容易实现回调,配合使用观察者模式,可以很方面的事件监听模型。例子如下:
//界面类
public class TestViewer extends TreeViewer {
Model model;
//构造函数
public TestViewer(final Composite parent, int style, Model model) {
super(parent,style);
this.model = model;
//内部匿名类,注册一个model的事件
md.addListener(new ModelListener() {
public void modelChanged(final Node obj) {
TestViewer.this.add(obj);//回调
}
});
}
//绘制界面,把获得的Node对象绘制到界面中
public void add(Node node){
}
}
//模型类
public class Model{
private List listeners = new ArrayList();//定义监听器数组
public void createNode(String name) throws InterruptedException {
SessionTreeNode tt=null;
try{
Node node=new Node(name);
}finally{
modelChanged(node);
}
}
//新增监听
public void addListener(ModeChangedListener listener) {
listeners.add(listener);
}
//调用所有的监听程序
public void modelChanged(Node node){
Object[] ls = listeners.getListeners();
for(int i=0;i<ls.length;++i){
try{
((ModeListener)ls[i]).modelChanged(node);
}catch(Throwable e){
}
}
}
}
//模型类中使用到的一个结点
public class Node{
public Node(String name){
}
}
//定义监听器借口
public interface ModelListener {
void modelChanged(Node node);
}
调用过程:
1.在应用上下文中新建一个Model: Model model = new Model();
如果是做插件程序,可以把model放在Plugin类中
2.当应用程序初始化时,会 new TestViewer(composite,style,model);
注意model此时被传入。当然model也可以保存在上下文中
3.在界面中引发一个事件,会调用model.createNode("node");
此时会调用所有的监听程序(Observer模式),它将执行回调用程序 TestViewer.this.add(obj);
于是,node将会被画到View上
4.可以把程序入口抽象到一组Action中,那就形成了一个MVC模式:程序入口就是C,Model就是M,View就是V
总结:使用以上技术,将模式和Java语言充分结合,可以很方面实现自己的事件监听模型