面试荔枝 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 生产方法必须要被重写或者处理异常. 是不是非常完美?
来源: http://www.bubuko.com/infodetail-2578032.html