GEF 框架中的设计模式
2010-06-07 00:00:00 来源:WEB开发网查看原图(大图)
EditPart 实例对象的创建则运用了抽象工厂模式。所有的 EditPart 均由 EditPartFactory 的子类负责创建,GEF 自身就提供了 RulerEditPartFactory 和 PaletteEditPartFactory 两个工厂实现。如果用户自定义 EditPart,必须提供相应的 EditPartFactory 类型才能正确创建用户的 EditPart 对象。
图 4. EditPartFactory 相关类图 (images/EditPartFactory.jpg)
工厂方法和抽象工厂之间的区别在于,工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
观察者 (Observer)
观察者模式是一种对象行为型模式,它可以定义对象间的一种一对多的依赖关系,当被依赖对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
通过选项栏创建连接时,ConnectionCreationTool 工具被生成用来创建连接,它通过监听鼠标的按下动作来设置连接的连接源,在设置连接源时,通过 addEditPartListener 方法为源 EditPart 添加 deactivationListener 监听。
清单 1. AbstractConnectionCreationTool 类中部分代码
package org.eclipse.gef.tools;
public class AbstractConnectionCreationTool
extends TargetingTool{
......
private EditPartListener.Stub deactivationListener = new EditPartListener.Stub() {
public void partDeactivated(EditPart editpart) {
handleSourceDeactivated();
}
};
protected boolean handleButtonDown(int button) {
if (isInState(STATE_INITIAL) && button == 1) {
updateTargetRequest();
updateTargetUnderMouse();
setConnectionSource(getTargetEditPart());
Command command = getCommand();
((CreateConnectionRequest)getTargetRequest()).setSourceEditPart(
getTargetEditPart());
if (command != null) {
setState(STATE_CONNECTION_STARTED);
setCurrentCommand(command);
viewer = getCurrentViewer();
}
}
if (isInState(STATE_INITIAL) && button != 1) {
setState(STATE_INVALID);
handleInvalidInput();
}
return true;
}
protected void setConnectionSource(EditPart source) {
if (connectionSource != null)
connectionSource.removeEditPartListener(deactivationListener);
connectionSource = source;
if (connectionSource != null)
connectionSource.addEditPartListener(deactivationListener);
}
protected void handleSourceDeactivated() {
setState(STATE_INVALID);
handleInvalidInput();
handleFinished();
}
}
更多精彩
赞助商链接