我的问题
在没有类型安全的情况下,什么设计允许我在两个模块之间选择性地传递数据?这样的事情有可能吗?
解释
我有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);
另一个类中的人需要知道确切的密钥名称,如果他们搞砸了什么,在编译时没有任何警告。有没有更安全的方法来做到这一点?
答案 0 :(得分:0)
我认为你所寻找的是“责任链”设计模式。 点击此处 - http://www.journaldev.com/1617/chain-of-responsibility-design-pattern-in-java-example-tutorial