Java:银行账户交易限制 -> 如何表示某些账户没有限制?

标签 java design-patterns

我有一个关于银行账户单笔交易限额的快速问题。我有不同类型的银行账户,每个账户都有一定的单笔交易限额。但是,这些帐户类型中的某些没有交易限制。我可以想出一个非常简单的解决方案,它只使用一个常量来表示(参见下面的示例)。

private static final double NO_TRANSACTION_LIMIT = -1;  

public enum BankAccountType {
    GIRO_MINOR(0, 20, "Minor Account"),
    GIRO_STUDENT(0, 200, "Student Account"),
    GIRO_NORMAL(-2000, 4000, "Normal Account"),
    SAVING(0, NO_TRANSACTION_LIMIT, "Saving Account");
    // ...
    private double transactionLimit;
    // ...
    public boolean hasTransactionLimit() {
        return transactionLimit == NO_TRANSACTION_LIMIT;
    }
}

经过一番思考,我认为一定有更好的解决方案来解决这个问题。因为如果由于某种原因在事务限制之前未检查 hasTransactionLimit() 方法,则可能会导致不需要的行为。
所以我的问题是:实现这样的行为的好策略是什么?不知怎的,我想到了空对象模式,但我很不确定。

最佳答案

我将使用方法 isTransactionAllowed(int amount) 创建一个接口(interface) BankAccount,而不是使用返回交易限制的枚举。

因为您想要对枚举执行的操作是执行特定于类型的代码。这就是枚举被命名为 ...Type 的原因。在像 java 这样的面向对象语言中,您应该使用多态性来做到这一点。

例如

public interface BankAccount {
    public boolean isTransactionAllowed(int amount);
}

具体的银行账户可以回答这个问题。静态或基于其实际状态。例如。 10 天内允许的交易限额为 200 笔,或者该银行账户允许的交易限额为 200 笔,而所有其他此类帐户仅允许 100 笔。

例如静态:

public class MinorBankAccount implements BankAccount {

    private static final int MINOR_ACCOUNT_TRANSACTION_LIMIT = 20;

    public boolean isTransactionAllowed(int amount) {
        return amount <= MINOR_ACCOUNT_TRANSACTION_LIMIT;
    }

}

你所做的通常是贫血设计的暗示。更多详情请查看我的博客 Enums as type discriminator anti-pattern

关于Java:银行账户交易限制 -> 如何表示某些账户没有限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47922670/

相关文章:

java - rabbitMQ 从 2 个队列消费

java - 从 DataBufferByte.getData 中为每种颜色获取 0-255 个值

java - 将 foursquare http 响应转换为 JSON for java

java - 互连应用程序 - Java EE

java - 创建共享对象池的享元设计模式

android - 在应用程序处于非 Activity 状态时处理 ActivityRecognition.API Intent

java - 用 Java 重写条件语句

node.js - NodeJS - 动态响应的缓存

java - 如何连接到plc并获取数据

java - 获取名称的最后一位数字