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

程序代码设计模式之模板方法模式(1)

今天我们将开始整理程序代码的设计模式,之前一直没有整理是因为网上讲的一大堆了,都烂大街了,现在又打算开始整理是因为设计模式要融入自己的程序代码里,不断的加深理解,去实践而不是只读读博文。本来标题想写java的十三种设计模式,但是我觉得不应该局限于java,也不应该局限于十三种,我们将来会不会创建出新的一种设计模式呢?
模板方法模式,是一种行为型设计模式。它在一个抽象类中公开定义了执行其方法的模板,规定了算法的骨架。其主要特点是将一些步骤延迟到子类中,这些子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

// 抽象类
public abstract class AbstractClass {// 抽象方法,包含算法的骨架public final void templateMethod() {step1();step2();step3();}// 具体步骤1protected abstract void step1();// 具体步骤2protected abstract void step2();// 具体步骤3protected abstract void step3();
}// 子类A
public class ConcreteClassA extends AbstractClass {@Overrideprotected void step1() {System.out.println("子类A执行步骤1");}@Overrideprotected void step2() {System.out.println("子类A执行步骤2");}@Overrideprotected void step3() {System.out.println("子类A执行步骤3");}
}// 子类B
public class ConcreteClassB extends AbstractClass {@Overrideprotected void step1() {System.out.println("子类B执行步骤1");}@Overrideprotected void step2() {System.out.println("子类B执行步骤2");}@Overrideprotected void step3() {System.out.println("子类B执行步骤3");}
}

那在Android源码中哪里用了这个模式呢?比较典型的是View 绘制流程代码:

Android源码中,TemplateMethod模式常常用于View的绘制流程中。例如,在View类中的draw方法就是一个模板方法,它定义了视图绘制的基本步骤,而具体的绘制实现则在不同的子类中实现。以下是View类中draw方法的一个简化版本的代码示例:public class View {// ...public void draw(Canvas canvas) {// 模板方法,实现了基本的绘制流程// 1. 初始化绘制参数initializeDrawing();// 2. 绘制背景onDrawBackground(canvas);// 3. 绘制内容,具体的绘制实现在子类中onDraw(canvas);// 4. 绘制子视图dispatchDraw(canvas);// 5. 绘制装饰(例如滚动条等)onDrawScrollBars(canvas);// 6. 绘制上层内容(例如焦点边框等)onDrawForeground(canvas);}// 下面是需要在子类中实现的方法protected void onDraw(Canvas canvas) {// 实现视图的绘制,子类必须实现该方法}// ...
}

在这个例子中,draw方法定义了视图绘制的基本步骤,而onDraw方法则留给子类去实现具体的绘制逻辑。这样做的好处是,draw方法为子类提供了一个清晰的绘制接口,同时保留了灵活性,允许子类根据需要自定义绘制过程。


http://www.mrgr.cn/news/71884.html

相关文章:

  • 汽车HiL测试:利用TS-GNSS模拟器掌握硬件性能的仿真艺术
  • 【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
  • 高质量代理池go_Proxy_Pool
  • Linux KASLR 地址偏移
  • Makefile 之 join
  • 如何在Debian系统里使用Redhat(CentOS)的方式配置网络
  • 利用服务工作线程serviceWorker缓存静态文件css,html,js,图片等的方法,以及更新和删除及版本控制
  • 力扣 LeetCode 59. 螺旋矩阵II(Day1:数组)
  • AlphaFold3中文安装教程
  • Nous Chat:AI 领域的又一惊艳之作,未来潜力不可忽视
  • 【Python Tips】Python内置函数isinstance——检测数据类型:处理多种类型的输入参数(对比type)
  • C/C++ 模板与so
  • 十六、多版本并发控制
  • 【大数据测试HBase数据库 — 详细教程(含实例与监控调优)】
  • 速盾:CDN和OBS能共用流量包吗?
  • 解决MySQL中整型字段条件判断禁用不生效的问题
  • excel常用技能
  • 电商系统表的1-n如何设计?情景分析
  • 基于Multisim温度计温度测量检测测量系统电路(含仿真和报告)
  • 【AI日记】24.11.12 东京贫困女子读后感 | 未来学习工作时间分配
  • Python模块练习2(dict)
  • arcgis for js实现popupTemplate弹窗field名称和值转义
  • MySQl基础----Linux下数据库的密码和数据库的存储引擎(内附 实操图和手绘图 简单易懂)
  • PCL 点云分割 基于超体素的分割
  • 线上问题的排查之MySQL死锁如何排查
  • 25浙江省考-专项刷题(资料分析)-错题本