安卓设计模式(七)模板方法模式

模板方法模式用于固定相关操作的执行流程,将具体实现延迟到子类中

该系列其他文章:

定义: 定义一个操作中算法的框架,而降一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.
使用场景:

  • 代码重构时,模板方法是经常被用到的,将固定部分提取到父类中,具体实现则由子类负责
  • 一系列操作总是有固定流程
  • 多个子类拥有公共方法,且逻辑基本相同

实现举例

在Android中,往往会有一些全局的基类,包括BaseActivity,BaseFragment等等,用于规范整个程序的View层的代码风格,此时,即可充分运用到模板方法模式:

BaseActivity:

public abstract class IBaseActivity extends AppCompatActivity {

    private SystemBarTintManager tintManager;
    private int systemBarColor = R.color.colorPrimaryDark;//默认的状态栏颜色
    protected final EventBus mEventBus = EventBus.getDefault();//事件总线

    @Override
    protected final void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getArgs();
        setContentView(initLayout());
        initWindow(systemBarColor);
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams
                .SOFT_INPUT_STATE_HIDDEN);//解决Andriod软键盘出现把原来的布局给顶上去的方法
        ButterKnife.bind(this);
        initView();
        requestData();
    }

    /**
     * 模板方法,用于返回布局ID
     */
    public abstract int initLayout();

    /**
     * 模板方法,初始化View
     */
    protected abstract void initView();

    /**
     * 模板方法,获取数据,执行耗时操作
     */
    protected abstract void requestData();

    /**
     * 提供给子类动态设置状态栏颜色
     */
    protected void setSystemBarColor(int colorId) {
        initWindow(colorId);
    }
    
    //...省略一体化状态栏处理

    /**
     * 该方法在onCreate中执行,用于获取Fragment的参数传递
     * 子类可按情况自行选择复写
     */
    protected void getArgs() {
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mEventBus.isRegistered(this)) mEventBus.unregister(this);
        ButterKnife.unbind(this);//取消注入
    }

}

使用:

public class TestActivity extends IBaseActivity {
    @Override
    public int initLayout() {
        return 0;
    }

    @Override
    protected void initView() {

    }

    @Override
    protected void requestData() {

    }
}

不难看出模板方法的两个关键点:

  • 父类中控制流程的方法定义为Final
  • 父类中提供一系列子类可复写的方法,从而将具体步骤中的实现延迟到子类中

从上面可以看出,BaseActivity中的Oncrea()方法被定义为Final,所以子类是无法重写的,这样可以很好的避免子类复写导致执行流程被打乱.由于父类中流程已经定义好,子类只需要负责具体实现的步骤即可,这样代码结构非常清晰,且不容易出错.

实际开发中可以多使用模板方法模式来进行上层结构的封装,固定操作流程,减少人为出错,也便于阅读.

关于作者

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,432评论 25 708
  • 目录 本文的结构如下: 引言 什么是模板方法模式 模式的结构 代码示例 优点和缺点 适用环境 模式应用 一、引言 ...
    w1992wishes阅读 828评论 0 3
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,979评论 1 15
  • 设计模式基本原则 开放-封闭原则(OCP),是说软件实体(类、模块、函数等等)应该可以拓展,但是不可修改。开-闭原...
    西山薄凉阅读 3,880评论 3 14
  • 中国到底多少个程序员?每年计算机专业毕业的有多少?而这些人中真正从事it行业的比例是多少呢?中国的程序员中的地域分...
    暖夏未眠丶阅读 233评论 0 0