当前位置: 首页 > news >正文

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,这样做其实有利于后期的版本迭代、层次抽离和代码重构…

相关文章:

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

1. 模式介绍 模式的定义 定义一个操作中的算法的框架&#xff0c;而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模式的使用场景 1.多个子类有公有的方法&#xff0c;并且逻辑基本相同时。 2.重要、复杂的算法&#xff0c;可…...

浏览器缓存技术--localStorage和sessionStorage原理与使用

localStorage和sessionStorage LocalStorageLocalStorage的特点存入/读取数据使用场景 sessionStoragesessionStorage的特点存入/读取数据使用场景sessionStorage 、localStorage 和 cookie 之间的区别 测试localStorage和sessionStorageIndexedDB LocalStorage 为了弥补 Cook…...

无涯教程-Perl - endservent函数

描述 此功能告诉系统您不再期望使用getservent从服务文件中读取条目。 语法 以下是此函数的简单语法- endservent返回值 此函数不返回任何值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perlwhile(($name, $aliases, $port_number,$protocol_name)getservent())…...

MRO工业品采购过程中,采购人员要注意哪些事项

MRO工业品指工厂或企业对其生产和工作设施、设备进行保养、维修&#xff0c;保证其运行所需要的非生产性物料&#xff0c;这些物料可能是用于设备保养、维修的备品备件&#xff0c;也可能是保证企业正常运行的相关设备&#xff0c;耗材等物资&#xff0c;如安全防护、传媒广电、…...

Jaeger 教程,OpenTelemetry 教程

ywanbing/otelToJaeger: opentelemetry 的链路追踪写入Jaeger中&#xff0c;使用的例子&#xff0c;拉下来就能跑&#xff08;你已经部署好Jaeger的环境&#xff09; (github.com) 上面是一个使用 OpenTelemetry trace 的一个源码。...

P1597 语句解析

题目背景 木有背景…… 题目描述 一串长度不超过 255 255 255 的 PASCAL 语言代码&#xff0c;只有 a , b , c a,b,c a,b,c 三个变量&#xff0c;而且只有赋值语句&#xff0c;赋值只能是一个一位的数字或一个变量&#xff0c;每条赋值语句的格式是 [变量]:[变量或一位整数…...

Java课题笔记~ Request请求

1.请求消息格式 客户端发送一个HTTP请求到服务器的请求消息包括以下格式&#xff1a; 请求行&#xff08;request line&#xff09;、请求头部&#xff08;header&#xff09;、空行和请求数据四个部分组成。下图给出了请求报文的一般格式。 GET请求&#xff1a; POST请求&am…...

Untiy Json和Xml的序列化和反序列化

Json的序列化和反序列化 1.定义数据类 [Serializable] public class ZoomPoint {// 点名称, 将作为Key被字典存储public string name;// 轴心X坐标public Vector2 pivot Vector2.one / 2;// 放大倍率&#xff0c;小于1是为缩小倍率&#xff0c;小于0是取绝对值&#xff0c;不…...

springboot在线小说阅读网站的设计与实现

网站首页&#xff1a; 用户登录/注册&#xff1a;用户注册时进行用户名及笔名存在的限制热门小说推荐&#xff1a;显示小说名及作者名&#xff0c;点击进入对应小说小说类别&#xff1a;玄幻&#xff0c;武侠&#xff0c;言情&#xff0c;历史等&#xff0c;点击对用分类到分类…...

整理mongodb文档:改

个人博客 整理mongodb文档:改 求关注&#xff0c;求批评&#xff0c;求进步 文章概叙 本文主要讲的是mongodb的updateOne以及updateMany&#xff0c;主要还是在shell下进行操作&#xff0c;也讲解下主要的参数upsert以及更新的参数。 数据准备 本次需要准备的数据不是很多…...

【设计模式】单例模式

什么是单例模式&#xff1f; 保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点 单例模式的应用场景 1.整个程序的运行中只允许有一个类的实例&#xff1b; 2.需要频繁实例化然后销毁的对象。 3.创建对象时耗时过多或者耗资源过多&#xff0c;但又经常用到…...

(2)原神角色数据分析-2

功能一&#xff1a; 得到某个属性的全部角色&#xff0c;将其封装在class中 """各元素角色信息&#xff1a;一对多""" from pandas import DataFrame, Series import pandas as pd import numpy as npclass FindType:# 自动执行&#xff0c;将…...

138. 复制带随机指针的链表

138. 复制带随机指针的链表 题目-中等难度示例1. 题目-中等难度 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&…...

Windows中redis怎么设置密码

设置密码有两种方式&#xff0c;用过第一种可以 1. 命令行设置密码。 运行cmd切换到redis根目录&#xff0c;先启动服务端 >redis-server.exe 另开一个cmd切换到redis根目录&#xff0c;启动客户端 >redis-cli.exe -h 127.0.0.1 -p 6379 客户端使用config get requ…...

租赁OLED透明屏:打造独特商业体验的智慧选择

近年来&#xff0c;OLED透明屏技术在商业领域中迅速崛起&#xff0c;其高透明度和卓越的图像质量为商家创造了全新的展示方式。 租赁OLED透明屏作为一种智慧选择&#xff0c;不仅能提升品牌形象和吸引力&#xff0c;还能创造与众不同的视觉体验。 对此&#xff0c;尼伽将和大…...

Nacos服务治理—负载均衡

引入负载均衡 在消费方引入负载均衡机制&#xff0c;同时简化获取服务提供者信息的流程 Spring Cloud引入组件LoadBalance实现负载均衡 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web<…...

flask-----初始项目架构

1.初始的项目目录 -apps 包 ------存放app -user文件夹 -------就是一个app -models.py --------存放表模型 -views.py -------存放主代码 -ext包 -init.py -------实例化db对象 -manage.py -----运行项目的入口 -setting.py -----配置文件 2.各文件内容 manage…...

揭秘史上最全可视化大屏模板,00后亲测好用到离谱,效率加速99%

前几天老陈公司刚入职的一个00后&#xff0c;昨天被领导叫到办公室怒批了一个小时&#xff0c;我在外面都能听到领导的怒吼声&#xff0c;直接骂他是个垃圾&#xff0c;屁用没有&#xff0c;学都白上了。一个180的大高个小伙&#xff0c;直接被骂到痛哭流涕&#xff0c;走出办公…...

nginx基于主机和用户访问控制以及缓存简单例子

一.基于主机访问控制 1.修改nginx.conf文件 2.到其他主机上测试 &#xff08;1&#xff09;191主机 &#xff08;2&#xff09;180主机 二.基于用户访问控制 1.修改nginx.conf文件 2.使用hpasswd为用户创建密码文件&#xff0c;并指定到刚才指定的密码文件webck 3.测试…...

React使用antd的图片预览组件,点击哪个图片就预览哪个的设置

使用了官方推荐的相册模式的预览&#xff0c;但是点击预览之后&#xff0c;每次都是从图片列表的第一张开始预览&#xff0c;而不是点击哪张就从哪张开始预览&#xff1a; 所以这里我就封装了一下&#xff0c;对初始化预览的列表进行了逻辑处理&#xff1a; 当点击开始预览的…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...