模板模式源码级应用

模板模式我之前总结过
https://blog.csdn.net/u011109881/article/details/82453771
模板模式的思想:先在父类规定了具体的算法步骤以及算法顺序。父类可以给出部分步骤的具体实现,也可以都只给出方法框架,没有具体实现。在子类具体实现各个步骤的方法,但是各个步骤间的顺序在父类已经确定,子类无法通常不应该更改。如果规定算法顺序的方法在父类被定义成final,则子类就无法更改了。具体实现,子类可以根据实际需求确定是否修改。
模板方法的应用

1.AsyncTask的源码设计

之前也有过总结:
https://blog.csdn.net/u011109881/article/details/79943321
只不过当时并不知道AsyncTask有使用过模板设计模式
现在回过头看AsyncTask规定了自身执行的步骤:
onPreExecute doInBackground onPostExecute 子类或者说实现者可以根据自身需要在不同的步骤里面做想做的事情。这就是模板设计模式的思想

2.View的绘制流程

View的绘制流程我之前也有过总结
https://blog.csdn.net/u011109881/article/details/111148885
https://blog.csdn.net/u011109881/article/details/111188621
view的绘制流程里面有重要的三步,按先后顺序是ViewRootImpl中的
performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);
performLayout(lp, mWidth, mHeight);
performDraw();
performMeasure内部会调用view的measure方法,measure方法内部又调用onMeasure方法
performLayout(lp, mWidth, mHeight);内部会调用view的layout方法,layout方法内部又调用onLayout方法
performDraw中兜兜转转最后还是调用了view的draw方法,draw方法内部又会调用onDraw方法
因此我们在自定义view的时候 通常可以通过覆盖onMeasure onLayout onDraw等方法来实现自定义view,其实父类以及规定好了步骤 我们只需要完善某一步骤。甚至说单单view的draw方法都是一个模板方法的使用 我们可以看看:

     */@CallSuperpublic void draw(Canvas canvas) {final int privateFlags = mPrivateFlags;mPrivateFlags = (privateFlags & ~PFLAG_DIRTY_MASK) | PFLAG_DRAWN;/** Draw traversal performs several drawing steps which must be executed* in the appropriate order:**      1. Draw the background*      2. If necessary, save the canvas' layers to prepare for fading*      3. Draw view's content*      4. Draw children*      5. If necessary, draw the fading edges and restore layers*      6. Draw decorations (scrollbars for instance)*/// Step 1, draw the background, if neededint saveCount;drawBackground(canvas);// skip step 2 & 5 if possible (common case)final int viewFlags = mViewFlags;boolean horizontalEdges = (viewFlags & FADING_EDGE_HORIZONTAL) != 0;boolean verticalEdges = (viewFlags & FADING_EDGE_VERTICAL) != 0;if (!verticalEdges && !horizontalEdges) {// Step 3, draw the contentonDraw(canvas);// Step 4, draw the childrendispatchDraw(canvas);drawAutofilledHighlight(canvas);// Overlay is part of the content and draws beneath Foregroundif (mOverlay != null && !mOverlay.isEmpty()) {mOverlay.getOverlayView().dispatchDraw(canvas);}// Step 6, draw decorations (foreground, scrollbars)onDrawForeground(canvas);// Step 7, draw the default focus highlightdrawDefaultFocusHighlight(canvas);if (debugDraw()) {debugDrawFocus(canvas);}// we're done...return;}

这里step1到7都是官方注释,这个其实就是模板方法 指定执行顺序
父类把step1 step2 等都定义好了,子类可以选择性覆盖这些方法

练练手 使用模板设计模式创建BaseActivity

public abstract class BaseActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 设置布局layoutsetContentView();// 初始化头部initTitle();// 初始化界面initView();// 初始化数据initData();}// 初始化数据protected abstract void initData();// 初始化界面protected abstract void initView();// 初始化头部protected abstract void initTitle();// 设置布局layoutprotected abstract void setContentView();/*** 启动Activity*/protected void startActivity(Class<?> clazz){Intent intent = new Intent(this,clazz);startActivity(intent);}/*** findViewById* @return View*/protected <T extends View> T viewById(int viewId){return (T) findViewById(viewId);}
}

创建BaseActivity的好处有两点
1.规定了Activity的执行步骤,使得整个应用的Activity看起来比较一致,代码清晰
2.可以在BaseActivity实现一些Activity常用的方法, 避免每个Activity都去创建类似的方法,或者直接调用的时候产生冗余代码

红橙Darren视频笔记 模板模式的应用与BaseActivity相关推荐

  1. 红橙Darren视频笔记 代理模式 动态代理和静态代理

    红橙Darren视频笔记 代理模式 动态代理和静态代理(Android API 25) 关于代理模式我之前有过相关的介绍: https://blog.csdn.net/u011109881/artic ...

  2. 红橙Darren视频笔记 仿QQ侧滑效果

    这一篇没有什么新的内容 就是改写 红橙Darren视频笔记 仿酷狗侧滑效果 的侧滑的效果 1.去掉淡入淡出效果 2.加上黑色模板效果 效果: 去掉淡入淡出效果很简单 就是注释掉onScrollChan ...

  3. 红橙Darren视频笔记 UML图简介

    整体架构复制自红橙原视频的课堂笔记 因为他这一课没有博客,所以没有转载链接,CSDN没有转载地址是无法作为转载类型的文章发表的,暂时标记为原创 参考链接 https://blog.csdn.net/r ...

  4. 红橙Darren视频笔记 类加载机制(API28) 自己写个热修复 查看源码网站

    第一部分 类加载机制 一个Activity是如何被Android虚拟机找到的? 在之前的文章 红橙Darren视频笔记 自定义View总集篇(https://blog.csdn.net/u011109 ...

  5. 红橙Darren视频笔记 利用阿里巴巴AndFix进行热修复

    注意 由于AndFix在2017年左右就停止更新了,在最新版本的apk上遇到很多问题,我最终也没有成功进行热修复.本节主要是学习热修复的原理 在上一篇 红橙Darren视频笔记 自己捕获异常并保存到本 ...

  6. 红橙Darren视频笔记 Behavior的工作原理源码分析

    主要coordinatorlayout的代码来自coordinatorlayout-1.0.0-sources.jar 本文从源码介绍 CoordinatorLayout 的 behavior 怎么工 ...

  7. 红橙Darren视频笔记 ViewGroup事件分发分析 基于API27

    本节目标,通过案例,先看程序运行结果,然后跟踪源码,理解为什么会有这样的输出,继而理解view group的分发机制,感觉和证明题很像呢. 考虑以下程序的运行结果: case1: public cla ...

  8. 红橙Darren视频笔记 view的绘制流程(上) onMeasure测量代码分析 基于API27

    一.准备工作Activity的onCreate和onResume调用过程 从ActivityThread的handleLaunchActivity开始进行代码跟踪 private void handl ...

  9. 红橙Darren视频笔记 流式布局tagLayout measure layout方法学习 adapter使用 学习感悟

    效果: 自定义View public class TagLayout extends ViewGroup {private static final String TAG = "TagLay ...

最新文章

  1. kendo #数据结构 #重心分解
  2. NSS_06 extjs弹出窗口上的文本框默认获得焦点
  3. becon帧 wifi_WireShark对于WIFI数据帧的分析
  4. 计算机网络专业教学模式,计算机网络技术专业教学模式改革探索
  5. 内部矩阵维度必须一致simulink_深度学习/目标检测之numpy——向量和矩阵乘法相关...
  6. Cable--新虚拟网络架构介绍
  7. 【Codeforces Round #299 (Div. 2) C】 Tavas and Karafs
  8. Cisco ASA 5505 (Version 9.X)的 LAN上网和NAT的配置
  9. (转) Csrss进程剖析
  10. 深圳禾正医院自控系统案例|能迪科技canlead中央空调净化系统
  11. 二分法的适用范围及通用代码
  12. PLC1200 模拟量采集
  13. airpods pro是按压还是触摸_泼冷水:AirPods Pro至今为止媒体们还没提到但影响使用体验的TIPS...
  14. 电脑搬家——SecureCRSecureFXPortable和SecureCRTPortable乱码
  15. 酷睿i7和i5对计算机专业要求,英特尔i5已经足够用 还有必要升级i7处理器吗?
  16. PRML笔记:1-介绍
  17. uni-app 相机相册选择图片转base64
  18. 数据结构上机——希尔排序(含监视哨版本)
  19. 排序-----直接插入排序------带监视哨和不带监视哨
  20. Deformable ConvNets v2 原理与代码解析

热门文章

  1. vb.net 同时给多个属性赋值_系统小技巧:充分用好文件的时间属性
  2. xdebug调试时出错 --mxp
  3. 洛谷 P4300 BZOJ 1266 [AHOI2006]上学路线route
  4. 字符编码-Unicode等
  5. 一位程序员的爱情故事
  6. [JS] - onmusewheel事件(兼容IE,FF)
  7. 2008 读第一本书
  8. limux下分屏tmux的使用
  9. 二分+BFS——刺杀大使(洛谷 P1902)
  10. C语言课后习题(8)