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

今天我们将开始整理程序代码的设计模式,之前一直没有整理是因为网上讲的一大堆了,都烂大街了,现在又打算开始整理是因为设计模式要融入自己的程序代码里,不断的加深理解,去实践而不是只读读博文。本来标题想写java的十三种设计模式,但是我觉得不应该局限于java,也不应该局限于十三种,我们将来会不会创建出新的一种设计模式呢?

模板方法模式,是一种行为型设计模式。它在一个抽象类中公开定义了执行其方法的模板,规定了算法的骨架。其主要特点是将一些步骤延迟到子类中,这些子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

java 复制代码
// 抽象类
public abstract class AbstractClass {
    // 抽象方法,包含算法的骨架
    public final void templateMethod() {
        step1();
        step2();
        step3();
    }

    // 具体步骤1
    protected abstract void step1();

    // 具体步骤2
    protected abstract void step2();

    // 具体步骤3
    protected abstract void step3();
}

// 子类A
public class ConcreteClassA extends AbstractClass {
    @Override
    protected void step1() {
        System.out.println("子类A执行步骤1");
    }

    @Override
    protected void step2() {
        System.out.println("子类A执行步骤2");
    }

    @Override
    protected void step3() {
        System.out.println("子类A执行步骤3");
    }
}

// 子类B
public class ConcreteClassB extends AbstractClass {
    @Override
    protected void step1() {
        System.out.println("子类B执行步骤1");
    }

    @Override
    protected void step2() {
        System.out.println("子类B执行步骤2");
    }

    @Override
    protected void step3() {
        System.out.println("子类B执行步骤3");
    }
}

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

java 复制代码
在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方法为子类提供了一个清晰的绘制接口,同时保留了灵活性,允许子类根据需要自定义绘制过程。

相关推荐
二哈赛车手7 分钟前
新人笔记---Spring AI的Advisor以及其底层机制讲解(涉及源码),包含一些遇见的Spring AI的Advisor缺陷问题的解决方案
java·人工智能·spring boot·笔记·spring
AC赳赳老秦12 分钟前
接口测试自动化:用 OpenClaw 对接 Postman,实现批量回归测试、测试报告自动生成与推送
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
两年半的个人练习生^_^12 分钟前
Java日志框架和使用、日志记录规范
java·开发语言·开发规范
pq2171 小时前
最简单的理解synchronized锁升级
java
杨凯凡1 小时前
【032】排查入门:jstack、heap dump、Arthas 初识
java·开发语言·后端
pq2171 小时前
Spring FactoryBean源码解析
java·spring boot·spring
其实防守也摸鱼1 小时前
无线网络安全--实验 规避WLAN验证之发现隐藏的SSID
java·开发语言·网络·安全·web安全·智能路由器·无线网络安全
sg_knight1 小时前
Python 设计模式:迭代器模式——用优雅的方式遍历一切
python·设计模式·迭代器模式
书源丶1 小时前
四十三、网络编程(下)——TCP 编程与 HTTP 入门
java·网络·tcp/ip·http
木井巳1 小时前
【递归算法】单词搜索
java·算法·leetcode·决策树·深度优先