小白自我提高学习设计模式笔记—模板模式

Posted 好人静

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小白自我提高学习设计模式笔记—模板模式相关的知识,希望对你有一定的参考价值。

前言

         结合着android源码把所有的设计模式总结一下。

        小白自我提高学习设计模式笔记(一)—代理模式

        小白自我提高学习设计模式笔记(二)—装饰者模式

        小白自我提高学习设计模式笔记(三)—装饰者模式在Android开发的小试

        小白自我提高学习设计模式笔记(四)—责任链模式

        小白自我提高学习设计模式笔记(五)—模板模式


        在小白自我提高学习设计模式笔记(四)—责任链模式中通过模板模式将所有的ConcreteHandler将每个ConcreteHandler的逻辑进行模板化。

一 模板模式

1.定义

        模板模式(Template Pattern):通过抽象类来定义执行行为的方式或模板。子类只需要复写该抽象类就可以实现该行为的整个执行过程。

        行为型模式。

        主要组成部分:

  • (1)抽象类/抽象模板(Abstract Class):抽象模板类,负责实现行为的轮廓或骨架。有模板方法和若干基本方法组成。
    • 模板方法:定义了行为的骨架,里面实现了调用基本方法的逻辑;为了防止恶意操作,一般模板方法都会加上final关键词;
    • 基本方法:构成行为的每个步骤,其中可以为:
      • 抽象方法:子类必须复写,用来实现子类自己的逻辑;
      • 钩子方法:通常给到是一个空方法,主要是用于判断的逻辑方法或需要子类复写的空方法,例如可以在模板方法的调用期间增加一个调用钩子方法,那么当子类复写该方法的时候,就可以增加到了整个行为执行过程,和抽象方法的区别在于子类不一定需要实现;
      • 具体方法:辅助其他方法的方法,子类不需要实现或复写
  • (2)具体实现类(Concrete Class):具体的实现类。继承抽象类/抽象模板。实现父类的抽象方法和钩子方法。   

2.优缺点

优点

  • (1)将公共部分提取成抽象方法,提高代码复用,便于维护;
  • (2)将不变部分封装到父类实现,子类扩展可变部分,子类也可通过扩展方式增加其他功能;
  • (3)父类实现具体的行为,子类无需关心具体逻辑。

缺点

  • (1)每个不同的实现都需要一个子类来实现,使得系统类膨胀;
  • (2)父类修改抽象方法,所有的子类都需要修改。

3.与策略模式区别

  • (1)策略模式和模板模式都是用来封装算法的,而策略模式用的是组合,而模板模式使用的是继承;
  • (2)策略模式关注的是多种算法;而模板模式关注的是一种算法

二 应用场景

        模板模式主要用来解决下面的问题:

  • (1)有多个子类共有方法,且逻辑相同
  • (2)重要复杂方法可以有模板方法来计算核心内容,细节功能通过子类实现

1.在Android开发中的应用

        在小白自我提高学习设计模式笔记(四)—责任链模式中的3.对APP启动逻辑的优化在每个具体的ConcreteHandler的时候由于有共同的特点:都是需要判断下符合该业务逻辑的则交给本业务逻辑的ConcreteHandler进行处理,否则转交给下一个Handler进行处理,并且都需要有一个判断跳转的条件,所以将所有的ConcreteHandler进行模板化:

  • (1)模板方法handlerAppLauncherEvent()

        将上述的逻辑放到模版方法handlerAppLauncherEvent()中,代码如下:

    @Override
    //模版方法
    final public void handlerAppLauncherEvent(Activity context) {
        //符合该条件的直接交给该Handler进行处理
        if (isSelfAppLauncherEventHandler(context)) {
            Log.v(String.format("~~~~~~~~~~~~ 进入到 \\"%s\\" 处理逻辑", getClass().getSimpleName()));
            handlerSelfAppLauncherEvent(context);
            return;
        }
        Log.d(String.format("~~~~~~~~~~~~ 交给下一个 \\"%s\\" 处理逻辑", getClass().getSimpleName()));
        //否则交给下一个Handler进行处理
        goToNextAppLauncherEventHandler(context);
    }

        可以看到这个模版方法中实现了根据是否符合本业务逻辑的条件,将具体的处理过程交给本ConcreteHandler还是下一个Handler

  • (2)基本方法中的抽象方法handlerSelfAppLauncherEvent()

           每个具体的ConcreteHandler必须要实现handlerSelfAppLauncherEvent(),用于处理本ConcreteHandler的业务逻辑


    /**
     * 显示本Handler处理的广告逻辑
     */
    //基本方法
    public abstract void handlerSelfAppLauncherEvent(Activity context);

          具体的代码已经上传到github:地址为https://github.com/wenjing-bonnie/pattern.git的com.android.pattern.template下的相关代码。 可结合小白自我提高学习设计模式笔记(四)—责任链模式看这些代码

2.在Android源码的模板模式

(1)Android源码中的AsyncTask类  

         在Android源码中的AsyncTask类采用的就是模板模式。可以通过创建一个AsyncTask类轻松实现子线程的操作。当执行task.execute()会依次调用onPreExecute()、 doInBackground()、onPostExecute(),并且可以通过在onProgressUpdate()来更新进度,整个执行过程就是一个模板模式的体现。        

        但是从Android11开始,该API废弃,推荐使用Executor、ThreadPoolExecutor、FutureTask或者kotlin的协程Coroutines。官方指出在使用AsyncTask类的时候,容易造成context内存泄漏、回调失败或则在改变配置的时候造成崩溃。

        遗留问题:ThreadPoolExecutor、FutureTask两个区分。

(2)Activity生命周期加载

        在Android 跨进程通信-(三)Binder机制之Client三 从Native看APP进程的初始化中在APP进程加载过程中会执行ActivityThread的main()函数的时候会通过消息循环队列的方式,依次加载Activity的生命周期方法。同样也是采用模版方式。

三 总结

        模板模式在平时用的还是比较多的,简单总结下:

  • 1.模板模式主要通过抽象类来定义执行行为的方式或者模板,子类只需要继承抽象类就可以拥有该行为;
  • 2.模板模式主要有模板方法和基本方法组成:
    • (1)模板方法:实现了行为的主要逻辑,为了防止恶意修改,通常加上final;
    • (2)基本方法:抽象方法、钩子方法和具体方法。其中抽象方法必须复写,钩子方法通常是一个空方法,可选择复写,具体方法通常不复写
  • 3.模板模式主要作用就是将通用的部分抽象成抽象方法,提高代码复用率;
  • 4.将不变的部分封装到父类,子类只需要实现变化的部分

以上是关于小白自我提高学习设计模式笔记—模板模式的主要内容,如果未能解决你的问题,请参考以下文章

小白自我提高学习设计模式笔记—模板模式

小白自我提高学习设计模式笔记—模板模式

小白自我提高学习设计模式笔记—责任链模式

小白自我提高学习设计模式笔记—责任链模式

小白自我提高学习设计模式笔记—责任链模式

小白自我提高学习设计模式笔记—装饰者模式