类设计 - 避免冗余代码

时间:2014-10-21 17:47:19

标签: java oop design-patterns

我有一个A类扩展B类。 我的B班有5种抽象方法。在所有这5种方法中,我需要对methodA()进行一次调用。这个问题是因为我需要创建40个扩展classB的类,我需要为methodA编写相同的调用,每个类和所有这40个类编写5次。 所以我最终写了对methodA的调用,大约200次。

现在我该如何设计这个,以便我不需要在子类级别进行这些调用?

以下示例

此处的methodA是一种在数据库中记录用户操作的方法。 所以每次我创建一个扩展类B的类时,在所有5个抽象方法中,我需要调用一个方法A来记录用户在数据库中的操作。

由于

3 个答案:

答案 0 :(得分:4)

你可以使用这样的模式:

abstract public class B {
    /** Override to implement the subclass logic */
    abstract protected SomeClass reallyCalculateStuff();

    /** The public API method to be called by clients of the class */
    final public SomeClass calculateStuff() {
        executeSharedCode();
        return reallyCalculateStuff();
    }

    /** The method all other methods need to call */
    private void executeSharedCode() {
        // ...
    }
}

public class A extends B {
    @Override
    protected SomeClass reallyCalculateStuff() {
        // ...
    }
}   

你显然想要提出更好的名字。但这个想法是基类已经包含公共API并负责调用共享方法。

如果executeSharedCode需要在每个子类中以不同方式实现,这也会有效。只需将其设为abstract

但是,根据用例,可能有更好的替代方案。例如,拦截器。重新考虑设计可能也是值得的,因为可以通过不同地设计类来避免这种模式。但是如果没有背景,所有这些事情都无法判断,所以我只是给你这种模式。

答案 1 :(得分:0)

如果要减少代码复制,可以使B中的方法非抽象,并为它们提供方法体。这意味着它们不再是抽象的,但由于所有子类都将继承此行为,您仍然可以放心,它们都将能够使用该方法。因此,B中的方法可以调用methodA(),即使在子类中定义了methodA,如果它们需要唯一的行为,它们也可以被子类覆盖。

答案 2 :(得分:0)

不幸的是,没有办法从根本上打电话给父母的身体'方法。您需要使用super明确一点。

您的父班:

public class B {
    public methodA() {}
    public firstMethod() {
        methodA();
    }
}

您的实施:

public class A extends B {
    public firstMethod() {
        super.firstMethod();
        // method body
    }
}

因此,您仍然需要在实现中调用super.firstMethod,但至少在这种情况下,您可以拥有比单个方法调用更广泛的默认实现。