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

一、定义:

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

二、结构:

AbstractClass抽象类:定义算法的骨架,包含模板方法和若干基本方法(抽象方法、具体方法、钩子方法)。

ConcreteClass具体子类:实现抽象类中的抽象方法,覆盖某些具体方法或钩子方法以定制算法的步骤。

三、代码示例:

1.抽象模板类

public abstract class DataExporter {

// 模板方法(final禁止覆盖)

public final void exportData(List<String> data, String filename) {

if (validateData(data)) {

String formattedData = formatData(data); // 抽象方法

writeToFile(formattedData, filename); // 抽象方法

sendNotification(); // 钩子方法

}

}

// 抽象方法(子类必须实现)

protected abstract String formatData(List<String> data);

protected abstract void writeToFile(String content, String filename);

// 具体方法(默认实现)

protected boolean validateData(List<String> data) {

return data != null && !data.isEmpty();

}

// 钩子方法(子类可选覆盖)

protected void sendNotification() {

// 默认不发送通知

}

}

2.具体子类

// 导出为 CSV 格式

public class CsvExporter extends DataExporter {

@Override

protected String formatData(List<String> data) {

return String.join(",", data); // 转换为 CSV

}

@Override

protected void writeToFile(String content, String filename) {

try (FileWriter writer = new FileWriter(filename)) {

writer.write(content);

} catch (IOException e) {

e.printStackTrace();

}

}

// 覆盖钩子方法(导出后发送通知)

@Override

protected void sendNotification() {

System.out.println("CSV文件导出完成!");

}

}

// 导出为 JSON 格式

public class JsonExporter extends DataExporter {

@Override

protected String formatData(List<String> data) {

return "{ \"data\": " + data.toString() + " }"; // 简化的JSON格式

}

@Override

protected void writeToFile(String content, String filename) {

try (FileWriter writer = new FileWriter(filename)) {

writer.write(content);

} catch (IOException e) {

e.printStackTrace();

}

}

}

3.使用模板方法

public class Main {

public static void main(String\[\] args) {

List<String> data = Arrays.asList("Apple", "Banana", "Cherry");

// 导出为 CSV

DataExporter csvExporter = new CsvExporter();

csvExporter.exportData(data, "data.csv");

// 导出为 JSON

DataExporter jsonExporter = new JsonExporter();

jsonExporter.exportData(data, "data.json");

}

}

四、应用场景:

1.多个子类有相同流程但部分步骤不同,如文件导出,网络请求。

2.需要控制子类的扩展点,如钩子方法。

3.框架设计,如Activity的生命周期,AsyncTask。

五、优缺点:

优点:

1.代码复用,避免重复算法流程;

2.扩展性强,子类只需关注差异步骤;

3.封装不变部分,提升可维护性。

缺点:

1.灵活性受限,算法流程固定;

2.继承强耦合,违法合成复用原则

3.父类修改影响子类

相关推荐
蒸鱼Yuzheng18 分钟前
移动端 CPU 调度分析:线程亲和性、大小核迁移与卡顿
android·perfetto·性能分析·线程优化·cpu调度
booboosui31 分钟前
安卓唤醒词:12 维 MFCC 加 DTW,阈值 1.8
android
传奇开心果35 分钟前
Compose Multiplatform 共享边界实战:架构契约、互操作同步与可回退设计
android·kotlin
事圆则缓1 小时前
从开机到首帧:Android 系统与应用启动流程源码分析
android
AI吃大瓜1 小时前
指针压力表读数4:Android实现指针压力表读数(可实时检测)
android·指针读数·指针压力表·压力表·压力表读数
fengci.1 小时前
CTF2刷题记录(困难部分)
android·开发语言·前端·学习·php
hunterandroid2 小时前
[Android 从零到一] ARouter 路由框架原理:APT 生成路由表与组件化通信
android
最好一梦2 小时前
佳维视安卓工控机在堆垛机中的应用
android
传奇开心果编程3 小时前
组合优先开发范式:从汉字造字原理到声明式UI组件组合思想
android·flutter·ios·swiftui·移动开发·harmonyos·android jetpack
腾讯端服务3 小时前
一码Duo端-Kuikly-iOS折叠屏新UI适配实践
android·ui·ios·kotlin·鸿蒙