在这种情况下创建通用DAO或将其与较小的DAO分开是否更好?

时间:2017-02-22 10:07:35

标签: java oop interface

我参与了一个Java项目,该项目从不同的支付代理获取支付信息,处理它并存储到我们的计费系统(数据库)。

由于我们有不同的代理商,因此我们有不同的付款协议,我们有时会采用类似的,有时候不同的方式来处理付款某些协议需要添加,检查和删除付款,某些协议需要检查支付状态并添加付款,而其他协议则需要实施非常具体的协议方法。因此很难设计DAO接口的层次结构。

最终,我们创建了一个通用DAO接口,支持所有可能的付款方法,以及每个支付代理的DAO接口的一个实现。如果支付代理不支持特定方法实现,则抛出UnsupportedOperationException()。 E.g:

    piblic interface Dao {
        void addPayment(Payment p);
        void removePayment(Payment p);
        ...
        String getVersion();
    }

    public PaymentAgentDao implements Dao {
        public void addPayment(Payment p) {...}
        public void removePayment(Payment p) {...}
        public String getVersion() {
            throw new UnsupportedOperationException();
        }
    }

    public AnotherAgentDao implements Dao {
        public void addPayment(Payment p) {...}
        public void removePayment(Payment p) {
            throw new UnsupportedOperationException();
        }
        public String getVersion() {...}
    }

我想知道处理这种情况的最佳方法是什么?另一种方法是创建特定的接口(我在SOLID中的原则),但由于不可能创建接口层次结构,因此会有代码重复。没有支持所有支付代理的基本方法。处理这种情况的最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

我认为这是正确的,但它可以略有改进。

  • 我认为接口的更好名称是Agent甚至PaymentAgent,因为这是系统中对象的类型。我坚持认为你有所有这些类型的单一类型,但是对象会像人一样不同 - 所有类似,但做同样的事情有点不同。因此,一个代理只是付款,另一个代理检查,第三个可以做黑魔法......

  • 除了界面之外,我还要创建一个抽象类PaymentAgentAdapter,所有方法都具体,但什么都不做。这样,这些代理的所有具体对象都只需要实现它们实际需要的方法。这有助于缩短代码。

  • 我会考虑抛弃UnsupportedOperationException带来的不便甚至不正确,因为它需要在客户端尝试捕获代理的所有方法。