gpt4 book ai didi

需要 Java 模式 : instantiate object based on class of other object

转载 作者:行者123 更新时间:2023-11-29 07:59:49 24 4
gpt4 key购买 nike

在我的应用程序中有代表任务的对象(存储在数据库中)。还会有一些对象具有任务的实际实现(一些业务逻辑)——我们称它们为运行器。所以运行者可以即实现以下接口(interface):

public interface Runner<T> {
void run(T task);
}

给定一个任务对象,我需要一些好的方法来创建/获取一个运行器以便我可以运行它。

我宁愿避免类似的事情

if(task instance of DoSomethingTask) {
return new DoSomethingTaskRunner();
} else if(task instance of DoSomethingElseTask) {
return new DoSomethingElseRunner();
}

因为每当我创建一个新的运行者时,我还需要记住在上面的 block 中添加另一个 if/else。自动获取实现

的运行程序会很好
Runner<myTask.getClass()> // pseudocode ;)

一个很好的方法是让任务有一个“getRunner”方法(添加一个新任务我需要实现这个方法所以我不能忘记它)但不幸的是由于项目依赖我的任务对象什么都不知道关于运行者。

关于如何以一种好的方式做到这一点有什么想法吗?

顺便说一句:我正在使用 Spring,因此根据传递的任务获取一个 Runner bean 会更好。

最佳答案

您需要一个 RunnerFactory。如果你不想测试任务的类,你可以使用访问者模式,它允许基本上做你想做的事(myTask.createRunner()),但任务之间没有任何耦合和运行者:

public interface TaskVisitor<R> {
R visitTask1(Task1 task1);
R visitTask2(Task2 task1);
}

public interface Task {
// ...
<R> R accept(TaskVisitor<R> visitor);
}

public class Task1 implements Task {
// ...
@Override
public <R> R accept(TaskVisitor<R> visitor) {
return visitor.visitTask1(this);
}
}

public class Task2 implements Task {
// ...
@Override
public <R> R accept(TaskVisitor<R> visitor) {
return visitor.visitTask2(this);
}
}

public class RunnerFactory implements TaskVisitor<Runner> {
@Override
public Runner visitTask1(Task1 task1) {
return new Task1Runner(task1);
}

@Override
public Runner visitTask2(Task1 task2) {
return new Task2Runner(task2);
}
}

现在,要从任务中获取运行者,您只需调用

RunnerFactory factory = new RunnerFactory();
Runner runner = someTask.accept(factory);

如果你添加一个新的任务类型,你将被迫实现它的accept()方法,这将迫使你为访问者添加一个新方法,以及一个新的Runner实现.

关于需要 Java 模式 : instantiate object based on class of other object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15090615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com