Android模板设计模式之 - 构建整个应用的BaseActivity

1. 模式介绍

模式的定义
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

模式的使用场景
1.多个子类有公有的方法,并且逻辑基本相同时。
2.重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
3.重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。

2. UML类图

在这里插入图片描述
角色介绍

  • AbstractClass : 抽象类,定义了一套算法框架。
  • ConcreteClass1 : 具体实现类1;
  • ConcreteClass2: 具体实现类2;

3. 模式的简单实现

简单实现的介绍
模板方法实际上是封装一个算法框架,就像是一套模板一样。而子类可以有不同的算法实现,在框架不被修改的情况下实现算法的替换。下面我们以开电脑这个动作来简单演示一下模板方法。开电脑的整个过程都是相对稳定的,首先打开电脑电源,电脑检测自身状态没有问题时将进入操作系统,对用户进行验证之后即可登录电脑,下面我们使用模板方法来模拟一下这个过程。

实现源码

package com.dp.example.templatemethod;/*** 抽象的Computer* @author mrsimple**/
public abstract class AbstractComputer {protected void powerOn() {System.out.println("开启电源");}protected void checkHardware() {System.out.println("硬件检查");}protected void loadOS() {System.out.println("载入操作系统");}protected void login() {System.out.println("小白的电脑无验证,直接进入系统");}/*** 启动电脑方法, 步骤固定为开启电源、系统检查、加载操作系统、用户登录。该方法为final, 防止算法框架被覆写.*/public final void startUp() {System.out.println("------ 开机 START ------");powerOn();checkHardware();loadOS();login();System.out.println("------ 开机 END ------");}
}package com.dp.example.templatemethod;/*** 码农的计算机* * @author mrsimple*/
public class CoderComputer extends AbstractComputer {@Overrideprotected void login() {System.out.println("码农只需要进行用户和密码验证就可以了");}
}package com.dp.example.templatemethod;/*** 军用计算机* * @author mrsimple*/
public class MilitaryComputer extends AbstractComputer {@Overrideprotected void checkHardware() {super.checkHardware();System.out.println("检查硬件防火墙");}@Overrideprotected void login() {System.out.println("进行指纹之别等复杂的用户验证");}
}package com.dp.example.templatemethod;public class Test {public static void main(String[] args) {AbstractComputer comp = new CoderComputer();comp.startUp();comp = new MilitaryComputer();comp.startUp();}
}

输出结果如下 :

------ 开机 START ------
开启电源
硬件检查
载入操作系统
码农只需要进行用户和密码验证就可以了
------ 开机 END ------
------ 开机 START ------
开启电源
硬件检查
检查硬件防火墙
载入操作系统
进行指纹之别等复杂的用户验证
------ 开机 END ------

过上面的例子可以看到,在startUp方法中有一些固定的步骤,依次为开启电源、检查硬件、加载系统、用户登录四个步骤,这四个步骤是电脑开机过程中不会变动的四个过程。但是不同用户的这几个步骤的实现可能各不相同,因此他们可以用不同的实现。而startUp为final方法,即保证了算法框架不能修改,具体算法实现却可以灵活改变。startUp中的这几个算法步骤我们可以称为是一个套路,即可称为模板方法。因此,模板方法是定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。如图 :
在这里插入图片描述

4. 构建整个应用的BaseActivity

每个项目肯定离不开Activity,在Activity的onCreate()方法里面基本都是:设置布局 ->初始化头部 -> 初始化界面 -> 初始化数据。如果按照这么个流程是不是刚好符合我们模板设计模式。

public abstract class BaseActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView();initTitle();initView();initData();}// 初始化数据protected abstract void initData();// 初始化界面protected abstract void initView();// 设置界面视图protected abstract void setContentView();// 初始化头部protected abstract void initTitle();
}

以后我们每次新建Activity就不会直接继承自 AppCompatActivity 而是我们自己的BaseActivity就会自动要我们复写BaseActivity里面的几个抽象方法,我们在方法里面写对应的代码。

public class MainActivity extends BaseActivity {@Overrideprotected void initData() {}@Overrideprotected void initView() {}@Overrideprotected void setContentView() {setContentView(R.layout.activity_main);}@Overrideprotected void initTitle() {}
}

这也没见到什么好处啊~好处我待会再来说,我们先对BaseActivity来扩展一下,一些通用的流程和功能其实可以放在BaseActivity里面,比如前几次所分享的自己动手打造一套IOC注解框架、启动Activity…

public abstract class BaseActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView();// IOC注解注入ViewUtils.inject(this);initTitle();initView();initData();}// 初始化数据protected abstract void initData();// 初始化界面protected abstract void initView();// 设置界面视图protected abstract void setContentView();// 初始化头部protected abstract void initTitle();/*** 启动一个Activity* @param activity  需要启动的Activity的Class*/public void startActivity(Class<? extends Activity> activity) {Intent intent = new Intent(this,activity);startActivity(intent);}/***  findViewById 不需要再去强转*/public <T extends View> T viewById(@IdRes int resId) {return (T) super.findViewById(resId);}
}

接下来我们来说一下好处,模板设计模式的好处就不说了网上太多了,我们就只说在真正的开发中这么做的好处

  • 在实际的开发过程中我们往往不是一个人在开发,如果把直接在onCreate()里面写很多东西显然不行,但是如果写一些方法,那么每个成员所写的方法都会不同,何况有些哥们英语估计没过四级,单词都写错;
  • 直接继承自BaseActivity会自动提示覆盖方法,更加有利于开发或者代码的阅读,每个方法各尽其职只干自己该干的事,没事干就歇着;
  • 我们可以把通用的流程或者是某些方法放到BaseActivity,这样又节省代码又方便但是不是乱七八糟的放一大堆,细节会有很多具体可以看视频讲解;
  • 我们中间肯定还需要逻辑层的BaseActivity,这样做其实有利于后期的版本迭代、层次抽离和代码重构…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/89619.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

threejs中gltf模型出现的问题(黑色,颜色不协调,太小)和解决方案

模型一片漆黑 如下图 可能原因&#xff0c;没有灯光&#xff0c;加下以下代码&#xff1a; // 4、加入灯光 const lightness new THREE.HemisphereLight(0xffffff, 0x444444); lightness.position.set(0, 20, 0); scene.add(lightness); const shadowLight new THREE.Direct…

实现同时查找多个关键词——KeywordCrafter - 关键词匠心

具体功能&#xff1a;同时查找多个关键词&#xff0c;高亮加粗显示&#xff0c;并关键词显示出现次数。 &#x1f9d0;碎碎念&#xff1a;最近在写文案的时候&#xff0c;总是要避免出现一个敏感词汇&#xff0c;利用 (commandF) or (CtrF) 查找&#xff0c;只能一个一个单词去…

中国艺术孙溟㠭篆刻作品《得大自在》

关汉卿《四块玉闲适》&#xff1a;“适意行&#xff0c;安心坐。渴时饮&#xff0c;饥时餐&#xff0c;醉时歌。困来时就向莎茵卧。日月长&#xff0c;天地阔&#xff0c;闲快活。” 整理/释门

JS逆向系列之猿人学爬虫第14题-备而后动-勿使有变

文章目录 题目地址参数分析参考jspython 调用往期逆向文章推荐题目地址 https://match.yuanrenxue.cn/match/14题目难度标的是困难,主要难在js混淆部分。 参数分析 初始抓包有无限debugger反调试,可以直接hook 函数构造器过掉无限debugger Function.prototype.__construc…

[FPAG开发]使用Vivado创建第一个程序

1 打开Vivado软件&#xff0c;新建项目 选择一个纯英文路径 选择合适的型号 产品型号ZYNQ-7010xc7z010clg400-1ZYNQ-7020xc7z010clg400-2 如果型号选错&#xff0c;可以单击这里重新选择 2 创建工程源文件 可以看到文件创建成功 双击文件打开&#xff0c;插入代码 modul…

IOC容器

DI&#xff08;依赖注入&#xff09;&#xff1a;DI&#xff08;Dependency Injection&#xff09;是一种实现松耦合和可测试性的软件设计模式。它的核心思想是将依赖关系的创建与管理交给外部容器&#xff0c;使得对象之间只依赖于接口而不直接依赖于具体实现类。通过依赖注入…

【分布式存储】数据存储和检索~B+树

为什么数据存储结构重要 在存储系统中&#xff0c;其实不管数据是什么样的&#xff0c;归根结底其实都还是取决于数据的底层存储结构&#xff0c;而主要常见的就是数据库索引结构&#xff0c;B树、Redis中跳表、以及LSM、搜索引擎中的倒排索引。本质都是如何利用不用的数据结构…

Linux下grep通配容易混淆的地方

先上一张图: 我希望找到某个版本为8的一个libXXX.8XXX.so ,那么应该怎么写呢? 先看这种写法对不对: 是不是结果出乎你的意料之外? 那么我们来看一下规则: 这里的 "*" 表示匹配前一个字符的零个或多个 于是我们就不难理解了: lib*8*.so 表示 包…

24近3年内蒙古大学自动化考研院校分析

今天给大家带来的是内蒙古大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、内蒙古大学 学校简介 内蒙古大学位于内蒙古自治区首府、历史文化名城呼和浩特市&#xff0c;距北京400余公里&#xff0c;是中华人民共和国成立后党和国家在民族地区创办的第一所综合大…

pytest数据驱动 pandas

pytest数据驱动 pandas 主要过程&#xff1a;用pandas读取excel里面的数据&#xff0c;然后进行百度查询&#xff0c;并断言 pf pd.read_excel(data_py.xlsx, usecols[1,2])print(pf.values)输出&#xff1a;[[‘听妈妈的话’ ‘周杰伦’] [‘遇见’ ‘孙燕姿’] [‘伤心太平…

npm 报错 cb() never called!

不知道有没有跟我一样的情况&#xff0c;在使用npm i的时候一直报错&#xff1a;cb() never called! 换了很多个node版本&#xff0c;还是不行&#xff0c;无法解决这个问题 百度也只是让降低node版本请缓存&#xff0c;gpt给出的解决方案也是同样的 但是缓存清过很多次了&a…

【小练习】交互式网格自定义增删改错误记录及解决(进行中)

经过之前的学习&#xff0c;已经能创建简单的交互式网格并设置自定义增删改按钮&#xff0c;但是实现上还是存在一些问题&#xff0c;来完善优化一下。 首先是修改&#xff0c;正常修改都会弹出修改框&#xff0c;里面是之前存储的信息&#xff0c;根据实际需要对其进行修改&a…

Sharding-JDBC概述

前言 ​ 随着业务数据量的增加&#xff0c;原来所有的数据都是在一个数据库上的&#xff0c;网络IO及文件IO都集中在一个数据库上的&#xff0c;因此CPU、内存、文件IO、网络IO都可能会成为系统瓶颈。当业务系统的数据容量接近或超过单台服务器的容量、QPS/TPS接近或超过单个数…

web测试与app测试的区别

web测试与app测试的区别 首先从系统架构来看的话&#xff1a; web项目&#xff0c;一般都是b/s架构&#xff0c;基于浏览器的&#xff0c;而app则是c/s的&#xff0c;必须要有客户端。那么在系统测试测试的时候就会产生区别了。 web测试只要更新了服务器端&#xff0c;客户端…

vscode自带的代码诊断工具在为 c++17 的特性报错,如何取消这些报错

ctrlshiftP 打开设置界面&#xff0c;找到这个项 调整为 c17 即可

OpenCV基本操作——算数操作

目录 图像的加法图像的混合 图像的加法 两个图像应该具有相同的大小和类型&#xff0c;或者第二个图像可以是标量值 注意&#xff1a;OpenCV加法和Numpy加法之间存在差异。OpenCV的加法是饱和操作&#xff0c;而Numpy添加的是模运算 import numpy as np import cv2 as cv imp…

【PDF.js】PDF.js的简单使用与CDN加速遇到的问题

PDF.js的简单使用与CDN加速遇到的问题 一、PDF.js是什么&#xff1f;二、PDF.js三、 选择PDF.js的版本下载1. Prebuilt (现代浏览器) *作者选择2. Prebuilt (历史淘汰浏览器)3. Source 来源4. 通过CDN加速5. 文件树PrebuiltSource 6. 尝试查看器 四、选择文档&#xff08;不是使…

Vue 引入 Element-UI 组件库

Element-UI 官网地址&#xff1a;https://element.eleme.cn/#/zh-CN 完整引入&#xff1a;会将全部组件打包到项目中&#xff0c;导致项目过大&#xff0c;首次加载时间过长。 下载 Element-UI 一、打开项目&#xff0c;安装 Element-UI 组件库。 使用命令&#xff1a; npm …

SpringBoot禁用Swagger3

Swagger3默认是启用的&#xff0c;即引入包就启用。 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version> </dependency> <dependency><groupId…

MySQL——Mysql安装教程- Windows

一、Mysql安装 1、下载mysql安装包 下载链接&#xff1a; 链接&#xff1a; https://pan.baidu.com/s/1rFpMqOCApiQQEwYSs9XSmg https://pan.baidu.com/s/1rFpMqOCApiQQEwYSs9XSmg 提取码&#xff1a;zt88 2、 安装 1&#xff09;选择电脑磁盘空闲的路径&#xff1a; 2&…