lcpsky

导航

模板模式抽象类实现

一、抽象类

abstract class AbsPopular{
    //模板方法
   // 在模板中直接实现某些步骤的方法。通常这些步骤的实现算法是固定的,而且是不怎么变化的,因此可以将其当做公共功能实现在模板中。
    public final void dataInitialing() throws Exception{
        //获取所有的public方法
        Method[] methods = getClass().getMethods();
        for (Method method : methods) {
            //判断是否是数据初始化方法
            if (isInitDataMethod(method)){
                method.invoke(this);
            }
        }
    }
//判断是否数据初始化方法,基本方法鉴别器
//一般的模板方法模式中,抽象模板需要定义一系列的基本方法,一般都是protected访问级别
//并且是抽象方法,这标志着子类必须实现这些基本方法,这对子类来说既是一个约束也是一个负担
//但是使用反射以后不需要定义任何抽象方法,只需要定义一个基本的方法鉴别器,即可加载符合
//规则的基本方法。鉴别器此处的作用是鉴别子类方法中哪些是基本方法,模板方法则是根据
//基本方法鉴别器返回的结果通过反射执行相应的方法
    protected  boolean isInitDataMethod(Method method){
        return method.getName().startsWith("init")     // init开始
                && Modifier.isPublic(method.getModifiers())//公开方法
                && method.getReturnType().equals(Void.TYPE)//返回值是void
                && !method.isVarArgs()//输入参数是空
                && !Modifier.isAbstract(method.getModifiers());//不是抽象方法
    }
}

二、实现类

class UserPopulator extends AbsPopular{
    public void initUser(){
        //初始化用户表,如创建,加载数据等
        System.out.println("初始化用户表,如创建,加载数据等");
    }
    public void initPassword(){
        //初始化密码
        System.out.println("初始化密码");
    }
    public void initJobs(){
        //初始化工作任务
        System.out.println("初始化工作任务");
    }
}```

三、测试

    public static void main(String[] args) {
        AbsPopular userPopulator = new UserPopulator();
        try {
            userPopulator.dataInitialing();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

四、总结

模板方法模式的一个目的就在于其他类来扩展或具体实现在模板中固定的算法骨架中的某些算法步骤。在标准的模板方法模式实现中,主要是使用继承的方式,来让父类在运行期间可以调用到子类的方法。分析程序中那些功能是可变的,那些功能是不变的,然后把不变的部分抽象出来,进行公共的实现,把变化的部分分离出去,用接口来封装隔离,或者是用抽象类来约束子类行为。Java里面能实现这样功能的理论依据是Java的后期绑定技术,对于出现子类覆盖父类方法的情况,在编译时是看数据类型,运行则是看实际的对象类型(new 操作符后的构造方法是哪个类的)。一句话:new 谁就调用谁的方法

------代码摘自《编写高质量代码:改善Java程序的151个建议》

posted on 2021-03-08 23:40  lcpsky  阅读(70)  评论(0)    收藏  举报