模板方法调用超级和使用实现

时间:2015-03-05 21:09:36

标签: java design-patterns template-method-pattern

我已经实施了模板方法,我遇到了这种情况:

public class ProductTemplate() {    
        protected Item getItemFromShop(){
        processItemPrice();
        callOrderSummary();

    }

    protected void processItemPrice() {
        Do some logic....
    }

    protected void callOrderSummary() 
        Do some logic....
    }

}

public class ImportedProduct extends ProductTemplate() {

    @Override
    protected Item getItemFromShop() {
        super.getItemFromShop(); // When i call this super method, they will use the processItemPrice() from the implementation
    }

    @Override
    protected void processItemPrice() {
        Do another logic....
    }
}

我怀疑是..可以调用一个超级方法,如果在这个超级方法中有一个方法调用并且我重写了这个方法,那么该类将使用哪种方法实现?

解决方案:好的它工作正常。但是当我有一个类调用一个方法被覆盖时,它是否无用有这个:

public class SimpleProduct extends ProductTemplate(){
    public processItemPrice(){
        super.processItemPrice()
    }

}

This ProductTemplate implements an interface, and is used within Strategy pattern.. is it right?

1 个答案:

答案 0 :(得分:2)

理解此类事情的最简单方法是将调试打印编码到代码中,看看会发生什么。

清理代码(以便编译)并添加一些打印件:

public class ProductTemplate {
    protected Item getItemFromShop() {
        processItemPrice();
        callOrderSummary();
        return null;
    }

    protected void processItemPrice() {
//        Do some logic....
        System.out.println("ProductTemplate.processItemPrice()");
    }

    protected void callOrderSummary() {
//        Do some logic....
        System.out.println("ProductTemplate.callOrderSummary()");
    }

}

public class ImportedProduct extends ProductTemplate {

    @Override
    protected Item getItemFromShop() {
        return super.getItemFromShop(); // When i call this super method, they will use the processItemPrice() from the implementation
    }

    @Override
    protected void processItemPrice() {
//        Do another logic....
        System.out.println("ImportedProduct.processItemPrice()");
    }

    public static void main(String[] args) {
        new ImportedProduct().getItemFromShop();
    }
}

如果您运行ImportedProduct类(现在因为我添加了main方法而可行),您将获得输出:

ImportedProduct.processItemPrice()
ProductTemplate.callOrderSummary()

显示确实调用了子类中的重写方法。

注意:无需像您一样覆盖getItemFromShop方法。它与被覆盖的方法没什么不同。