gpt4 book ai didi

java - 将不同操作委托(delegate)给不同类的设计模式

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:23:55 26 4
gpt4 key购买 nike

我有一个类 ABC 可以执行操作 a()、b() 和 c()(操作 == 方法),它们都是密切相关的。我也有类似的类(class) DE 和 FGH。将来,可能会添加具有其他操作的新类。类从不共享操作(例如,没有类 ADF)

我的程序应该能够执行所有这些操作,并且时间是“随机的”,这意味着我事先没有估计哪个操作将在何时执行/执行多少次。

我通过创建一个包装类“OperationInvoker”来处理这个程序。我的程序只能访问此调用程序,并且每个操作都有一个方法。这样做的优点是封装:如果创建新操作或现有操作或编辑新操作,则只需要编辑包装类。

我的问题是“巨大的”包装器是否是解决此问题的最佳模式?

我为此调查了观察者模式,我认为这不是一个合适的案例,因为 ABC、DE、FGH 类……从来没有任何共同利益。例如,如果需要执行操作 A,则所有已注册的类都会收到事件 A,并且只有 1 个类(即 ABC)真正对此事件感兴趣。所有其他已注册的类将丢弃该事件。对于所有的注册和观察,这似乎有点矫枉过正/开销。

委托(delegate)模式也遇到了同样的问题:我没有很多类以不同的方式执行相同的操作,因此拥有灵活的委托(delegate)系统没有意义。

有没有其他更好的模式,或者这只是一个简单的委托(delegate)包装类的例子?

编辑:有人问 ABC 到底是做什么的。嗯,我有一个描述 SOAP Web 服务的 WSDL 文件。我使用工具将此文件转换为 java 类。这意味着我无法控制这些类的内容,因为它们是自动生成的。所以我写了一个 WebServiceInvoker 类,它充当这些 Web 服务的包装器。这个包装类有 3 个方法:执行 Web 服务 A、执行 Web 服务 B 和执行 Web 服务 C。

随着程序的扩展,越来越多的 wsdl 文件进入画面。当然,没有一个 Web 服务做同样的事情。它们没有全部捆绑在一个大 wsdl 文件中的唯一原因是因为某些 Web 服务在逻辑上不属于其他 Web 服务。所以我结束了以下类(class):

  • 一个可以调用网络服务A、B和C的包装类
  • 一个可以调用网络服务D、E的包装类
  • 一个可以调用webservice F、G和H的包装类

将来可能会出现更多的 wsdl(以及包装类)。之所以在所有其他包装器周围有一个额外的包装器,是因为每个服务都需要使用“ session ID”来调用。所以每个包装器都需要知道这些信息。所以 superwrapper 持有这些信息,并且可以调用所有的网络服务。这也可以很好地用作 api:使用 Web 服务的程序对服务一无所知,它只有 1 个公共(public)方法可用于每个 Web 服务,通过 super 包装器。该程序当然知道每个 Web 服务返回什么(列表、字符串、什么都没有...)。

最佳答案

为了便于代码维护,我建议将包装器更改为如下所示:

public class Operations {
private ABC abcInst;
private DE deInst;
private FGH fghInst;

protected Operations(ABC abc, DE de, FGH fgh) {
this.abcInst = abc;
this.deInst = de;
this.fghInst = fgh;
}

public ABC getABC() { return abcInst; }
public DE getDE() { return deInst; }
public FGH getFGH() { return fghInst; }
}

这样这里就不需要维护(除非添加了一个新类)并且来自调用者的所有调用只需要额外的 .getABC().a() 而不是 .a() 等强调操作由不同的类执行,但仍允许通过传递 Operations 实例来访问所有功能。

关于java - 将不同操作委托(delegate)给不同类的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24928803/

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