什么样的面向对象设计会比较好?

问题描述 投票:0回答:1

我有几种类型的“服务任务”需要执行(任务 A、B 等)。有些对象定义了在小部件上实际执行这些任务的流程逻辑。所有这些任务都存储在调度程序类的列表中,该调度程序类决定将哪个任务发送到哪个进程类。

这些任务有一些共同的特征,例如完成任务的设施,以及一些共同的功能,例如该任务的总体设计流程时间。

那么什么是强大的设计呢?

我的第一个想法是使用包含这些共享功能的

Service_Task
抽象类。然后,每种类型的任务都会扩展
Service_Task
,添加特定于任务的要求。这允许
Scheduler
类拥有
List<Service_Task>
,而不是
Object
列表或每个任务的单独列表。

但是,由于进程逻辑取决于任务类型,这意味着调度程序需要使用

instanceof
检查任务的底层类型,以了解将其发送到哪个进程。我知道这通常被认为是一种代码味道,所以我想知道是否有一种明显更好的方法。

我正在使用 Java。

谢谢!

java oop design-patterns
1个回答
0
投票

有几种思考方法,但需要更多信息才能做出明智的选择。

1.为什么只有一个列表?

将事物放入列表的目的是您想要对其进行“相同”的操作。如果您为了将任务的类型放入抽象超类型列表中而剥离它们,然后立即询问您正在处理哪种类型,以便可以进行正确的调度,为什么还要麻烦呢?

2.有人需要知道哪个进程处理哪个任务

可以通过

instanceof
或通过单独的列表在您的调度程序中。但它也可能是通过类似访问者模式的流程逻辑类。请原谅语法。我的 Java 已经生锈了。

class ProcessLogic {

  public bool deals_with(ConcreteTaskTypeThatIDealWith task) {
    return true;
  }

  public bool deals_with(AbstractBaseType task) {
    return false:
  }

(但实际上你只是用重载作为变相的

instanceof
,呵呵)

3.流程逻辑是否应该在任务之外?

可能是的。但也许如果您有这两个类,一个用于任务,另一个用于处理任务的逻辑,那么您的类可能非常耦合,也许您可以在字段和方法周围提出不同的“边界”,这将允许您调度程序中的单个列表,然后在该列表中的每个对象上调用

processMe()
方法。

© www.soinside.com 2019 - 2024. All rights reserved.