我的问题
什么设计可以让我有选择地在两个模块之间传递数据而没有类型安全?这样的事情可能吗?
解释
我有 2 个从该类派生的模块
abstract class Module {
public abstract void init(App app);
public abstract void exit(App app);
public abstract void process(App app);
public abstract void paint(Graphics g);
}
App 类跟踪哪个模块是当前模块并允许该模块处理执行:
class App {
private Map<Class<? extends Module>, Module> allModules = ...;
private Module currentModule;
//things to be used in modules
private Canvas canvas;
protected void start() {
allModules.put(FirstModule.class, new FirstModule());
//...
currentModule = ...;
currentModule.init(this);
}
protected void process() {
currentModule.process(this);
}
protected void paint(Graphics g) {
currentModule.paint(g);
}
public void switchModule(Class<? extends Module> module) {
//perform validation
Module next = allModules.get(module);
currentModule.exit(this);
currentModule = next;
next.init(this);
}
//expose items that modules will use
public Canvas getCanvas() {
return canvas;
}
}
现在,第一个模块负责收集用户指定的“设置”;它们将显示可供选择的复选框,然后单击一个按钮,该按钮存储有关选中哪个复选框的信息:
class First extends Module {
private boolean firstBoxChecked, secondBoxChecked, thirdBoxChecked;
public void init(App app) {
canvas.addMouseListener(...);
}
public void process(App app) {
if(buttonClicked) {
app.switchModule(Second.class);
//pass data to next module
}
}
}
所以在模块执行过程中的某个时刻,它会切换当前模块。有时我想在当前模块和我切换到的模块之间传递数据(从第一个到第二个)。
我的尝试
我能想到的唯一“有效”方式是复制 Android 的切换活动设计(使用类似 Intent 的对象):
ModuleSwitchAction action = new ModuleSwitchAction(Second.class);
action.put("firstBoxChecked", "true");
//...
app.switchModule(action);
另一个班级的人需要知道确切的键名,如果他们搞砸了,在编译时没有任何警告。有没有更安全的方法来做到这一点?