Java 对象类型切换的替代方案

标签 java

我想使用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);}
}

现在,您的可配置类可以实现 SetCommand1SetCommand2visit 重载,它们将根据命令的类型接收“回调”传给你了。

关于Java 对象类型切换的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42673483/

相关文章:

java.lang.NoClassDefFoundError : com/amazonaws/services/s3/AmazonS3Client in Spark

java - appium 中的 NoSuchMethodError

java - Selenium 找不到输入类型提交

java - 如何得到想要的继承结果?

java - 使 JList 的选定索引消失

java - 创建一个类的多个实例,但根据特定属性保持它们唯一(多个 "singletons")

java - 使用来自 ant build.xml 的 Java 源目录来配置 Netbeans 项目

java - Java中的八进制转义导致错误的字节值,编码问题?

java - 如何在首选项之前显示加载屏幕类 [Libgdx & android]

java - Android:最小化应用程序并显示图标