Android设计模式之——模板方法模式

article/2025/8/5 4:23:46

一、介绍

在面向对象开发过程中,通常会遇到这样的一个问题,我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序,但是,某些步骤的具体实现是未知的,或者说某些步骤的实现是会随着环境的变化而改变的,例如,执行程序的流程大致如下:

  1. 检查代码的正确性;
  2. 链接相关的类库;
  3. 编译相关代码;
  4. 执行程序。

对于不同的程序设计语言,上述4个步骤都是不一样的,但是,它们的执行流程是固定的,这类问题的解决方案就是我们本章要讲的模板方法模式。

二、定义

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

三、使用场景

  • 多个子类有公有的方法,并且逻辑基本相同时。

  • 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。

  • 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。

四、模板方法模式的UML类图

UML类图:

这里写图片描述

角色介绍:

  • AbstractClass:抽象类,定义了一套算法框架。

  • ConcreteClass1:具体实现类1。

  • ConcreteClass2:具体实现类2。

五、简单示例

模板方法实际上是封装一个固定流程,就像是一套执行模板一样,第一步该做什么,第二步该做什么都已经在抽象类中定义好。而子类可以有不同的算法实现,在框架不被修改的情况下实现某些步骤的算法替换,下面以打开计算机这个动作来简单演示一下模板方法。打开计算机的整个过程都是相对固定的,首先启动计算机电源,计算机检测自身状态没有问题时将进入操作系统,对用户进行验证之后即可登录计算机,下面我们使用模板方法来模拟一下这个过程:

抽象的 Computer

/*** 抽象的 Computer*/
public abstract class AbstractComputer {//下面是抽象方法,子类可以覆盖,不允许外部直接调用这些方法,所以用protected/*** 开启电源*/protected abstract void powerOn();/*** 检查硬件*/protected abstract void checkHardware();/*** 载入操作系统*/protected abstract void loadOS();/*** 登录*/protected abstract void login();//下面是钩子方法,声明并实现/*** 是否需要登录* * @return true为需要登录*/protected boolean isLogin(){return true;}//下面是模板方法,定义为final,子类不能覆盖此方法 /*** 启动计算机方法,步骤为开启电源、系统检查、加载系统、检查是否登录。*/public final void startUp(){System.out.println("--------开机 START--------");powerOn();checkHardware();loadOS();if(isLogin()){login();}System.out.println("-------- 开机 END --------");}}

Windows系统电脑(不需登录):

/*** Windows系统电脑*/
public class WindowsComputer extends AbstractComputer{@Overrideprotected void powerOn() {System.out.println("Windows电脑开启电源");}@Overrideprotected void checkHardware() {System.out.println("Windows电脑检查硬件");}@Overrideprotected void loadOS() {System.out.println("Windows电脑载入操作系统");}@Overrideprotected void login() {}@Overrideprotected boolean isLogin() {return false;//返回false,不需登录}}

Mac系统电脑(需登录):

/*** Mac系统电脑*/
public class MacComputer extends AbstractComputer{@Overrideprotected void powerOn() {System.out.println("Mac电脑开启电源");}@Overrideprotected void checkHardware() {System.out.println("Mac电脑检查硬件");}@Overrideprotected void loadOS() {System.out.println("Mac电脑载入操作系统");}@Overrideprotected void login() {System.out.println("Mac电脑登录");}}

调用:

public class Client {public static void main(String[] args) {AbstractComputer comp = new WindowsComputer();comp.startUp();comp = new MacComputer();comp.startUp();}
}

结果:

--------开机 START--------
Windows电脑开启电源
Windows电脑检查硬件
Windows电脑载入操作系统
-------- 开机 END --------
--------开机 START--------
Mac电脑开启电源
Mac电脑检查硬件
Mac电脑载入操作系统
Mac电脑登录
-------- 开机 END --------

六、Android源码中的模板方法模式

1、AsyncTask

在使用AsyncTask时,我们都知道把耗时操作放到doInBackground(Params… params)中,在doInBackground之前,如果想做一些初始化操作,可以把实现写在onPreExecute中,当doInBackground执行完后会执行onPostExecute方法,而我们只需要构建AsyncTask对象,然后执行execute方法。

2、Activity的生命周期

ActivityThread的main函数被调用后,依次执行Activity的onCreate、onStart、onResume函数,用户通常在Activity的子类中覆写onCreate方法,并且在该方法中调用setContentView来设置布局。

七、区别

  • 工厂方法是模板方法的一种特殊版本。

  • 策略模式和模板方法模式都是封装算法,一个用组合,一个用继承。

  • 策略模式和模板模式通常可以互相替换。它们都像试卷,策略模式是选择题,模板模式是填空题。

八、总结

模板方法模式用4个字概括就是:流程封装。也就是把某个固定的流程封装到一个final方法中,并且让子类能够定制这个流程中的某些或者所有步骤,这就要求父类提取公用的代码,提升代码的复用率,同时带来了更好的可扩展性。

优点:

  • 封装不变部分,扩展可变部分。

  • 提取公共部分代码,便于维护。

缺点:

  • 需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本方法太多,将会导致类的个数增加,系统更加庞大,设计也更加抽象,此时,可结合桥接模式来进行设计。

http://chatgpt.dhexx.cn/article/n6uTnm06.shtml

相关文章

Android程序设计基础

#Android应用程序架构 Android程序的入口被称为Main Activity&#xff0c;带有界面的Android应用程序一般需要从Main Activity启动。 目录结构 Adnroid工程主要包括两个区域&#xff1a;源码区和资源区。 Mainifest.xml 下面是一个标准的AndroidManifest.xml文件样例。 <…

qt如何编写android程序,如何利用Qt开发Android应用程序

Qt 工具箱是一个使用广泛的跨平台GUI工具箱,可用于 Windows、Linux、Mac OSX 和许多手持平台。QT 具有良好结构化(但灵活)的面向对象的结构、清晰的文档以及直观的 API。 Qt最大的优势就是跨平台,一次性开发的Qt应用程序,可以跑Windows、跑linux、跑MAC……如今移动平台Andr…

Android插件化方案实践

一、插件化概述 1、插件化和组件化的区别 组件化是将一个app拆分为多个模块进行协作开发&#xff0c;每个模块都是一个单独的组件&#xff0c;这些组件可以相互依赖&#xff0c;也可以单独调试运行。但是最终发布的时候&#xff0c;这些组件会合并在一起&#xff0c;组成一个整…

Android手机开发课程设计之记事本

一、需求分析 1.1业务需求分析 近年来&#xff0c;随着生活节奏的加快&#xff0c;工作和生活的双重压力全面侵袭着人们&#xff0c;如何避免忘记工作和生活中的诸多事情而造成不良的后果就显得非常重要。为此我们开发一款基于Android系统的简单记事本&#xff0c;其能够便携…

MATLAB图形绘制--添加图例

添加图例 专业的图像总是附有图例来告诉读者曲线表示什么&#xff0c;下面我们将绘制两个表示势能的函数&#xff0c;他们由双曲三角函数sinh(x)和cosh(x)来定义&#xff0c;X的定义域为0&#xff5e;2&#xff0c;首先我们定义X&#xff1a; >> x [0:0.01:2];然后表示…

matlab 图例自定义,matlab中如何自定义图例_常见问题解析

pd接口是什么口_常见问题解析 pd接口也是“Type-C”的接口&#xff0c;支持扩充协议&#xff0c;可以给手机笔记本充电&#xff0c;也可以传输数据&#xff1b;而“Type-C”中的PD的意思指的是“USB Power Delivery”功率传输协议。 matlab中如何自定义图例&#xff1f;Matlab如…

Matlab 画多个图例( Plot multiple legends )

用matlab 画图时&#xff0c;发现线太多&#xff0c;生成的图例&#xff0c;遮盖了曲线。于是想画成多个图例&#xff0c;然后可以自由拖动。 废话不多说&#xff0c;2&#xff09;代码&#xff08;设置多个图例的部分在最后20行&#xff09;&#xff1b; 1&#xff09;效果。 …

matlab之图例legend的数字变量显示

legend是matlab的图例使用函数&#xff0c;其主要的只用方式为legend(内容1,内容2) 本文主要介绍一下legend如何引用数组的数字表现形式。 例如&#xff0c;若想要画一个滤波器的不同反馈系数的频率响应曲线&#xff0c;在设置条例内容时&#xff0c;需要手动输入反馈系数K的数…

MATLAB图例变成一列变多列的方法

小编在绘制GPS数据图像时&#xff0c;发现图例中元素个数有31个&#xff0c;当采用默认生成图例时&#xff0c;只有一列图例&#xff0c;显示结果如下 图例非常难看&#xff0c;而且占位子&#xff0c;如何让图例从一列变成多列呢&#xff1f; 这里小编给大家提供一个思路&…

matlab把图例放在左边,如何将图例放在p之外

如何将图例放在p之外 我有一系列20个图(不是子图)可以在一个图中制作。 我希望传说能够超越盒子。 与此同时,我不想改变轴,因为图形的大小减少了。 请帮助我以下查询: 我想将情节框保留在情节区域之外。 (我希望传说位于情节区域的右侧)。 无论如何,我减少了图例框内文本的…

matlab之在坐标区上添加图例函数legend

目录 一、功能 二、语法 1.legend(label1,...,labelN) 2.legend(labels) 3.legend(subset,___) 4.legend(target,___) 5.legend(___,Location,lcn) 6.legend(___,Orientation,ornt) 7.legend(___,Name,Value) 8.legend(bkgd) 9.lgd legend(___) 10.legend(v…

Matlab作图后的各种调整方法——线条、坐标、标题、图例

Matlab作图后的各种调整方法——线条、坐标、标题、图例 文章目录 Matlab作图后的各种调整方法——线条、坐标、标题、图例一 &#xff0c; 写在前面1.整个图窗 Figure&#xff08;gcf&#xff09;2.我们使用命令做出的线条 Line&#xff0c;例如plot命令3.坐标轴 Axes (gca) 二…

Matlab图例Legend多行排布、字体格式

适用于图例文字多&#xff0c;简单排布效果差的情形 1. 绘制图形&#xff0c;添加图例 %数据 x[1 2 3 4]; y1[16 2 3 13]; y2[5 11 10 8]; y3[9 7 6 12]; y4[4 14 15 1]; %画图plot(x,y1,r-o); %红色&#xff0c;实线&#xff0c;圆圈 hold on; plot(x,y2,k-d…

在MATLAB中的图例标注及实例说明

1.基本绘图函数 plot(Y)&#xff1a;其中输入参数Y就是Y轴的数据&#xff0c;一般习惯性输入向量 plot(X1,Y1,LineSpec,...,Xn,Yn,LineSpec):LineSpec为选项&#xff08;开关量&#xff09;字符串&#xff0c;用于设置曲线颜色、线型、数据点等&#xff1b;LineSpec的标准设定…

【Matlab】画图时去掉某些图例

1. 什么是legend函数&#xff1f; 在Matlab中&#xff0c;legend函数用于在图形中添加图例&#xff0c;以便更好地理解和解释数据。图例提供了与图形相关的标识&#xff0c;使观察者能够了解图形中不同元素的含义。 legend 函数的语法如下&#xff1a; legend(标签1, 标签2, …

【Matlab】论文各种图例配色Matlab绘制

1. Matlab 绘图 1.1. Plot 函数 x-pi:pi/10:pi; %以pi/10为步长 ytan(sin(x))-sin(tan(x)); %求出各点上的函数值 plot(x,y,--rs,... %绘制红色的虚线&#xff0c;且每个转折点上用正方形表示。LineWidth,2,... % 设置线宽为2Marke…

matlab图例使用技巧

matlab图例使用技巧 1 图形曲线1.1 曲线形状1.2 曲线颜色1.3 曲线粗细1.4 同时改变曲线的形状&#xff0c;粗细&#xff0c;颜色 2 图形字体大小 1 图形曲线 1.1 曲线形状 1.2 曲线颜色 颜色的改变 可以 通过改变R-G-B 的值改变线条的颜色&#xff1a; matlab命令 &#xff1…

如何使用Matlab绘制图形并标记图例

当我们在写cscd、EI或者SCI论文时&#xff0c;常常需要放置一些图片&#xff0c;通常情况下需要对图片进行一些处理&#xff0c;对图像横纵坐标、曲线进行标记。本文阐述如何使用Matlab来实现这些功能。 1、如何使用Matlab绘制相关曲线图 在Matlab中&#xff0c;常采用plot函数…

MATLAB中标注图例

当在一幅图中出现多种图形中&#xff0c;用户可以根据自己的需要&#xff0c;利用legeng命令对不同的图例进行说明。它的使用格式如下&#xff1a; 调用格式 说明 legend(string1,stri…

MATLAB的二维线图绘图函数plot()实例积累

目录 1 plot(Y)2 plot(X,Y)3 plot(___,Name,Value)4 坐标轴标注和图形标题5图例标注6 目前MATLAB的文本已支持Latex公式输入7 控制坐标轴范围 1 plot(Y) plot(Y) 创建 Y 中数据对每个值索引的二维线图。 如果 Y 是向量&#xff0c;x 轴的刻度范围是从 1 至 length(Y)&#xff…