Java模版方法的另一种实现

Posted 饭小胖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java模版方法的另一种实现相关的知识,希望对你有一定的参考价值。

  面试荔枝FM杯具,遂死磕AQS途中发现一个有趣的模版用法,记下来。

  模版方法是很重要的设计模式,在数据访问层、众多的插件接口都可见其影子,一般的实现都是在模版中定义抽象方法并使用其方法进行算法,让具体的模版定义定制的功能,类似:

public abstract class Template {
    public abstract A productA();
    private void strategy(){
    //......
    A a = productA();
    //......
    }
}

 

  然而有时候你可能没办法让productA() 称为抽象方法,比喻你需要把该方法用在构造器模式中,也就是在静态内部类模式中时;

  然而有时候你的模版可能有多个抽象方法,但不要求子类实现所有抽象方法,只需要实现个别就好了(参考AQS同步器的acquire()和acquireShare()就不需要全部实现)

  这个时候也要实现模版方法怎么办呢?

  下面介绍一种好方法,就是用异常,上代码

public class Template {
    public A productA(){
         throw new UnsupportedOperationException();    
    }
    public B productB(){
        throw new UnsupportedOperationException();    
    }

    private void strategy(){
    //......
    A a = productA();
    //......
    }
}

  这样子类如果调用相关方法就会抛出check异常了,如果一个子类的职责需要用到productA,那么编译器就会要求A生产方法必须要被重写或者处理异常。是不是非常完美?

 

以上是关于Java模版方法的另一种实现的主要内容,如果未能解决你的问题,请参考以下文章

Java读取Excel的另一种方法

Java生成PDF的另一种方法

如何使我的 ArrayList 线程安全? Java中解决问题的另一种方法?

学习KMP算法时想到的另一种好方法

学习KMP算法时想到的另一种好方法

PowerShell-自定义函数 Function的另一种写法