【问题标题】:How to design an abstract method when you don't know the type of parameters it will contain (building a Framework)当你不知道它所包含的参数类型时如何设计一个抽象方法(构建一个框架)
【发布时间】:2012-06-15 12:12:33
【问题描述】:

我正在设计一个框架来管理我们的移动客户端上的某些 api 调用和其他长期运行的任务。我将在一个基本的 java 程序上设计和实现它,然后可以将它传递给客户端开发人员以扩展框架中的类并实现他们的具体类,他们在其中执行特定于上下文的工作。

有一个地方,管理器会向正在等待任务的组件发送通知。现在在 AbstractManager 我有一个名为 registerClient(Messenger m) 的方法,客户端可以将自己注册为侦听器,以便他们知道任务何时完成。

现在,如果我想保持抽象,我不能说它是 Messenger 对象,每个应用程序和平台可能使用不同的通知实现。我该如何设计它以便registerClient 可以以任何方式实现?

【问题讨论】:

    标签: java design-patterns frameworks


    【解决方案1】:

    您可以提供一个接口(例如IMessenger),每个信使对象都需要实现该接口并使其成为参数的类型

    registerClient(IMessenger m)
    

    如果您为接口选择了正确的方法(大部分与您现在为Messenger 使用的方法相同),您可以提供可以在registerClient() 方法中使用的接口的多个实现

    【讨论】:

    • 是的,但这可能很难做到,因为例如在 android 上,messenger 是操作系统的一个类,它基本上是从 Handler 类生成的。可能无法让 Handler 实现IMessenger
    • 如果信使类没有通用的基类/接口,那么您将无法以通用方式编写您的registerClient。也许您可以改用Handler?我对android的细节不熟悉
    • 我想这就是问题所在。即使只是在 android 上,对于一个应用程序,客户端也可能使用所谓的Broadcast 发送消息,或者另一个可能使用Messenger。 . 当黑莓执行框架时,这变得更加混乱。我只知道我们会收集某种类型的对象并在它们上调用某个函数。也许泛型可能是这样的方式?
    • 即使对于泛型,您也需要两个类之间的一些共性才能做任何有用的事情。您似乎需要创建两种单独的管理器类型:一种用于Messenger 客户端的注册/处理,另一种用于Broadcast 客户端。或者,为相同的Manager 提供两个单独的registerClient() 方法:一个用于注册Messengers,另一个用于Broadcasts,然后保留一个单独的注册Messengers 集合,另一个用于注册Broadcasts
    • 我想我可能会创建一个名为 notifyClients 的抽象类,这将取决于具体的抽象来确定如何实现它(同时跟踪客户等)
    【解决方案2】:

    让它通用,这样你的方法就是 registerClient(T messenger)

    【讨论】:

      【解决方案3】:

      在创建 API 时,接口和泛型是你最好的朋友。当然,您并不确切知道会发生什么,但是通过为用户提供他们必须实现的界面,您可以确保您可以使用他们决定使用的任何具体实现来做您需要的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-01
        • 2023-03-07
        • 1970-01-01
        • 2016-10-12
        • 2022-01-25
        • 2017-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多