java - 通过不同类传递值的最佳设计模式

标签 java class design-patterns class-design system-design

<分区>

我正在构建一个具有以下要求的可扩展系统:

  1. 每个请求都会有2个属性:type, region
  2. 根据type和region的值,选择不同的配置
  3. 有超过20+类需要根据类型+地区选择配置。
  4. 业务逻辑涉及调用 20 多个类中的 30 多个函数,因此无法传递区域和类型。业务逻辑根据产品类型和状态有多个分支。主类包含业务逻辑并调用不同类中的各个函数来完成业务逻辑。请引用以下代码以了解业务逻辑。

实现它的一种方法是创建一个具有两个字段的类:type 和 region。在入口点,创建此类的对象并将其传递给每个函数调用。根据传递对象的类型+区域值,选择适当的配置。

不是在每个函数中传递类型+区域对象,有什么优雅的解决方案吗?喜欢动态扩展对象?或者在入口点设置一个对象,然后通过扩展任何特定类来重用它。我是系统设计和继承的新手,所以我想不出一个优雅的解决方案。

例如: 下面给出了业务逻辑的概述。 MainLogic 类中有 20 多个助手,每个助手都有 5 个以上的数据存储。我正在寻找一种优雅的解决方案,它不涉及在所有函数中传递 region+type。

@AllArgsConstructor
class MainLogic {
    BillingInfoHelper billingInfoHelper;
    ..........

    public Boolean executeRequest(RequestInput requestInput){
        final String region = requestInput.getRegion();
        final String type = requestInput.getType();

        final BillingInfo billingInfo = billingInfoHelper.get(region, type);
        ..............
    }
}

@AllArgsConstructor
class BillingInfoHelper {
    AccountIdDataStore accIdDataStore;
    BankNameDataStore bankNameDataStore;
    AddressDataStore addressDataStore;
    ........

    public BillingInfo get(String region, String type){
        String accountNumber = accIdDataStore.get(region, type);
        String bankName = bankNameDataStore.get(region, type);
        String address = addressDataStore.get(region, type);
        return new BillingInfo(accountNumber, bankName, address);
    }
}


@AllArgsConstructor
class AccountIdDataStore {
    Config configStore

    public String get(String region, String type) {
        configStore.getAccountNumber(region, type)
    }
}

最佳答案

可以把type和region这两个不同的变量做成java中的static。

class ClassName{
    public static String type = "some_value";
    public static String region = "some_value";
}

稍后您可以通过使用 ClassName.type

在任何其他类中使用这些变量

关于java - 通过不同类传递值的最佳设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57034674/

相关文章:

java - 在实现该接口(interface)的类中引用接口(interface)常量的最佳实践是什么?

python - 如何将自己的方法添加到内置的 str 类型中?

javascript - 如何使用 javascript 将变量的内容写入 <td>here</td> 的文本区域?

wpf - WPF 的模型 View ViewModel 的替代品

c++ - 是否有一个对称的设计模式让成员类可以有指向彼此的指针?

java - Spring Boot CrudRepository 或 JpaRepository - 如何将限制作为参数传递?

javassist:重命名类和字段类型

java - 即使文件发生变化,JUnit 测试用例也不会改变

javascript - 从构造函数启动单个实例并将其用作另一个类中的静态方法

c++ - 重构 switch 语句的设计模式