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

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.父类修改影响子类

http://www.dtcms.com/a/98233.html

相关文章:

  • 如何在 AI 搜索引擎(GEO)霸屏曝光,快速提升知名度?
  • RabbitMQ高级特性--重试特性
  • 【C++初阶】第12课—list
  • 人工智能入门(1)
  • 字符和字符串的输入方式
  • 安当SLAc操作系统安全登录解决方案:破解设备供应商Windows权限失控困局
  • 全自动数字网络机器人:重塑未来的无形引擎 ——从金融量化到万物互联,为何必须“ALL IN”?
  • MySQL 中的表连接(JOIN)详解
  • 六十天前端强化训练之第三十五天之Jest单元测试大师课:从入门到实战
  • 【C++20】format格式化输出
  • 每日一题 == 674. 最长连续递增序列
  • 26_ajax
  • qgis点从面图层上拾取属性
  • NLP高频面试题(二十四)——RAG相关内容简介
  • 【Java】public class Person{}和public Person{} 和 public Person person究竟都有哪些区别呢。
  • Java---类与对象
  • NLP高频面试题(二十三)对抗训练的发展脉络,原理,演化路径
  • 关于跨域与.NET的处理方案
  • 软考-高级-系统架构设计师【考试备考资料下载】
  • 自学-408-《计算机网络》(总结速览)
  • 区块链在教育领域的创新应用:改变传统教育的未来
  • 黑盒测试的等价类划分法(输入数据划分为有效的等价类和无效的等价类)
  • 综合实验
  • qt之使用redis与其他程序(python)交互同通信
  • 基于SpringBoot实现的高校实验室管理平台功能四
  • 多线程 -- Thread类
  • vue学习
  • Linux内核同步机制:解锁并发编程的奥秘
  • 软件的常用设计模式。可参考一个一个学习
  • 用Nginx实现负载均衡与高可用架构(整合Keepalived)