我想使用Java 8中的命令模式将各种命令传递给各种类的对象。问题是这些对象具有我不想公开公共(public) setter 的成员;我希望仅通过命令来操纵这些成员。我的问题是如何向命令公开这些成员(或者更好的是,包私有(private) setter )。如果我将它们作为界面的一部分,那么我会将它们公开。继承它们不是一个选择,因为我需要多重继承。那么,如果 setter 既不作为类的一部分也不作为接口(interface)的一部分公开,那么命令如何知道它们可用呢?
我想到的最好的解决方案是让相关的类打开命令类型并在类中完全实现命令的执行(因此成员可以是私有(private)的 -更好),只需从命令类中提取必要的信息即可。但是在面向对象语言中切换对象类型的想法让我感觉受到了玷污。有更好的办法吗?
最佳答案
使用Visitor Pattern :
- 您的可配置类是
Visitor
, - 您的命令类是
Element
, - 您将可配置类传递给命令的
accept
方法,命令将调用与命令类型相对应的方法。
这是一个例子:
interface CommandVisitor {
void visit(SetCommand1 cmd);
void visit(SetCommand2 cmd);
}
interface Command {
void accept(CommandVisitor v);
}
class SetCommand1 : Command {
public void accept(CommandVisitor v) {v.visit(this);}
}
class SetCommand2 : Command {
public void accept(CommandVisitor v) {v.visit(this);}
}
现在,您的可配置类可以实现 SetCommand1
和 SetCommand2
的 visit
重载,它们将根据命令的类型接收“回调”传给你了。
关于Java 对象类型切换的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42673483/