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

作者: uncochen | 来源:发表于2016-11-28 14:32 被阅读434次

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

    该系列其他文章:

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

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

    实现举例

    在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,所以子类是无法重写的,这样可以很好的避免子类复写导致执行流程被打乱.由于父类中流程已经定义好,子类只需要负责具体实现的步骤即可,这样代码结构非常清晰,且不容易出错.

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

    关于作者

    相关文章

      网友评论

        本文标题:安卓设计模式(七)模板方法模式

        本文链接:https://www.haomeiwen.com/subject/cqsopttx.html