【问题标题】:Which design pattern is best for defining multiple data converters based on some condition?哪种设计模式最适合根据某些条件定义多个数据转换器?
【发布时间】:2020-05-16 23:17:33
【问题描述】:

我有一个用例,我需要根据某些条件定义和调用不同的 RequestPreparationManager。假设条件是需要调用经理的团队名称(我正在创建一个将由我的组织中的多个团队使用的伞式框架)。我的问题是哪种设计模式最适合这种情况?我对我认为可以在这里使用的两种设计模式感到困惑——工厂设计模式和策略设计模式。但就最佳面向对象设计实践而言,我无法确定这两种设计模式中的哪一种(或任何其他适合这种情况的设计模式)是最好的。

我已经编写了一个非常基本的类定义,说明使用工厂和策略设计模式实际实现的样子:

// Common classes and interfaces

public interface RequestPreparationManager
{
    InputRequest prepareInputRequest(Map<String, Object> params);
}

public class MarvelRequestPreparationManager implements RequestPreparationManager
{
    @Override
    public InputRequest prepareInputRequest(Map<String, Object> params)
    {
        // Some Logic
    }
}

public class DCRequestPreparationManager implements RequestPreparationManager
{
    @Override
    public InputRequest prepareInputRequest(Map<String, Object> params)
    {
        // Some Logic
    }
}

// Factory Design Pattern

public class RequestPreparationManagerFactory
{
    public static RequestPreparationManager getManager(String teamName)
    {
        switch(teamName)
        { 
            case "Marvel" : 
                return new MarvelRequestPreparationManager();
            case "DC" : 
                return new DCRequestPreparationManager();
            case default : 
                throw new UnsupportedTypeException();
        }
    }
}

public class Driver
{
    public static void main()
    {
        Map<String, Object> params = new HashMap<>();
        InputRequest request = RequestPreparationManagerFactory.getManager("Marvel").prepareInputRequest(params);
    }
}

// Strategy Design Pattern

public class RequestPreparationManagerStrategy
{
    private Map<String, Object> params;

    public RequestPreparationManagerStrategy(Map<String, Object> params)
    {
        this.params = params;
    }

    public InputRequest prepareInputRequest(RequestPreparationManager requestPreparationManager)
    {
        return requestPreparationManager.prepareInputRequest(params);
    }
}

public class Driver
{
    public static void main()
    {
        Map<String, Object> params = new HashMap<>();
        RequestPreparationManagerStrategy strategy = new RequestPreparationManagerStrategy(params);
        InputRequest request = strategy.prepareInputRequest(new MarvelRequestPreparationManager());
    }
}

【问题讨论】:

    标签: java oop design-patterns solid-principles clean-architecture


    【解决方案1】:

    我的建议是使用事件驱动架构。而且由于您是用 java 编写的,我猜您将以某种形式使用 spring。

    https://www.baeldung.com/spring-events

    Spring 事件易于维护、代码可读且可以灵活地适应您的需求。

    如果这对您的情况有帮助,请告诉我。

    【讨论】:

    • 我不明白春季事件与我的用例有何关联?不需要发布或收听任何事件。我只需要定义 3-4 个不同的类,它们将为某些 API 准备一个请求,并且实际类的调用将在运行时根据某些条件决定。
    【解决方案2】:

    对我来说,您的 strategy pattern 示例根本没有多大意义,因为它并没有真正定义行为。使用策略模式,您可能会有一个通用的用户或管理器类,您使用特定的默认策略配置该策略,该策略可能会在应用程序配置期间或运行时更新,从而改变用户/管理器评估输入值的行为。这里的重点是,用户/经理盲目地调用策略,不知道它正在执行什么具体策略,它实际上也不在乎。

    一个典型的场景是当您需要根据用户的角色以不同的方式计算某些数字时。您无需将逻辑硬连接到用户中,而是将计算抽象为行为类(=策略),然后将其附加到相应的用户。在对该用户执行某些操作时,会调用内部策略来执行计算。请注意,用户本身是通用的,因此您实际上并没有将用户子类化。想象一个游戏引擎奖励玩家 XP,根据用户注册的订阅模式,他/她现在会获得不同的 XP 奖励。免费用户可能会获得 80% 的 XP,而普通用户可能会获得 100% 和 VIP 125% 的 XP。虽然您可以创建一个基于通用 User 类的类 FreeUserRegularUserVIPUser,但您可能如果您在奖金周末引入 TrialUser 或类似的类,而不是仅仅定义其 XP 的不同奖励方式,则需要实现更多。

    ...我需要根据一些条件定义和调用不同的RequestPreparationManagers

    听起来您已经在描述创建模式的用途,例如factory pattern 或配置的builder pattern。在这里,通常基于某些数据的可用性,决定需要创建(或重复使用)和返回哪个具体产品。

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多