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

专业网站设计服务在线咨询完整网站开发

专业网站设计服务在线咨询,完整网站开发,深圳网络设计公司,网站开发用软件文章目录 简介场景解决代码关键优化点 总结 简介 模板方法是一种行为设计模式,它在超类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。 场景 假如你正在开发一款分析文档的数据挖掘程序。用户需要向程序输入各种格式&…

文章目录

  • 简介
  • 场景
  • 解决
    • 代码
    • 关键优化点
  • 总结

简介

模板方法是一种行为设计模式,它在超类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。

场景

假如你正在开发一款分析文档的数据挖掘程序。用户需要向程序输入各种格式(PDF、DOC 或 CSV)的文档,程序会试图从这些文件中提取有意义的数据,再以统一的格式返回给用户。
程序的首个版本只支持 DOC 文件。下个版本,程序需要支持 CSV 文件。一个月后,程序又需要从 PDF 文件中抽取数据。
数据挖掘类中包含许多重复代码。
一段时间后,你发现这三个类中包含许多相似代码。尽管读取不同格式数据的代码完全不同,但数据处理和分析的代码却几乎完全一样。怎么在保持算法结构完整的情况下去除重复代码?这是第一个问题。
还有另一个与使用这些类的客户端代码相关的问题:客户端代码中包含许多条件语句,因为它要根据不同的文档类型选择合适的处理过程。 如果所有处理数据的类都有相同的接口或基类,那你就可以去除客户端代码里的条件语句,转而使用多态机制来调用处理对象的方法。

解决

模板方法模式建议把算法分解为一系列步骤,然后将这些步骤改写为方法,最后在“模板方法”中依次调用这些方法。步骤可以是抽象的,也可以有一些默认的实现。为了能够使用算法,客户端需要自己提供子类,并且实现所有的抽象步骤。可能还需重写一些步骤(但这一步中不包括模板方法自身)。
让我们想想怎么在数据挖掘程序里运用这样的方案。我们可为三个解析算法创建一个基类,这个类定义了一个模板方法-mine方法,这个方法会在内部调用不同的文档处理步骤。
模板方法将算法分解为步骤,并允许子类重写这些步骤,而非重写实际的模板方法。

首先,我们将所有步骤声明为抽象类型,强制要求子类自行实现这些方法。在我们的例子里,子类已经实现了必须的方法,因此我们只需调整这些方法的名称,让他跟超类的方法匹配就行了。
现在,让我们看看怎么去除子类里的重复代码。对于不同的文件格式,打开和关闭文件以及读取解析数据的代码都不同,所以不需要修改这些方法。但分析原始数据和生成报告等其他步骤的实现方式非常相似,所以可以把他们提取到基类里,让子类共享这些代码。
所以我们有两种类型的步骤:

  1. 抽象步骤必须由各个子类来实现
  2. 可选步骤已经有一些默认实现,但你仍然可以在需要时进行重写
    还有另一种名为钩子 hook 的步骤。钩子是内容为空的可选的步骤。即使子类不重写钩子,模板方法也能工作。钩子通常放置在算法重要步骤的前后,为子类提供额外的算法扩展点。

代码

// 抽象类定义模板方法
abstract class DataMiner {// 模板方法(不可被覆盖)public final void processDocument() {  openDocument();extractRawData();parseData();           // 抽象步骤analyzeData();         // 通用实现generateReport();      // Hook方法}// 文档打开基础实现protected void openDocument() {  System.out.println("打开文档...");}// 数据抽取基础实现protected void extractRawData() {  System.out.println("抽取原始数据...");}// 解析算法必须子类实现protected abstract void parseData();  // 通用分析实现protected void analyzeData() {  System.out.println("执行数据聚类分析...");}/* 钩子方法(可选覆盖) */protected void generateReport() {  System.out.println("生成基础统计报表");}
}// 具体子类实现
class PDFDataMiner extends DataMiner {@Overrideprotected void parseData() {  // 实现特定解析逻辑System.out.println("解析PDF版式结构");System.out.println("提取PDF文本流");}
}class CSVDataMiner extends DataMiner {@Overrideprotected void parseData() {  System.out.println("识别CSV分隔符");System.out.println("映射CSV字段");}@Overrideprotected void generateReport() {  // 自定义Hook实现super.generateReport();System.out.println("追加CSV格式验证结果");}
}// 客户端调用示例
class Client {public static void main(String[] args) {System.out.println("处理PDF文档:");DataMiner pdfProcessor = new PDFDataMiner();pdfProcessor.processDocument();  // 执行完整流程System.out.println("\n处理CSV文档:");DataMiner csvProcessor = new CSVDataMiner();csvProcessor.processDocument();}
}

关键优化点

  1. 固定流程:不可重写的processDocument()确保流程一致
  2. 职责分离:各子类仅需实现格式相关解析逻辑
  3. 扩展能力:通过钩子方法实现可选扩展(如CSV格式验证)

总结

在这里插入图片描述

  1. 抽象类(Abstract­Class)会声明算法步骤的方法(step1,step2…),以及依次调用它们的模板方法(templateMethod)。算法步骤可以被声明为抽象类型,也可以提供一些默认实现。
  2. 具体类(Con­crete­Class)可以重写所有步骤,但不能重写模板方法自身。
http://www.dtcms.com/a/608716.html

相关文章:

  • php mysql网站开发实例教程一流的中小型网站建设
  • 专业东莞网站建设报价重庆seowhy整站优化
  • 有建设网站的软件吗天津造价信息网
  • 广州建立网站贵阳做网站优化
  • 网站开发成本最低多少钱大型的营销型网站
  • 二个字最吉利最旺财的公司名seo销售好做吗
  • 哪个网站域名便宜wordpress装修主题
  • 技术支持 盈岚网站建设空间设计师网站
  • 网站建设界面建议php网站建设填空题
  • 西安网站建设的费用做前后端网站教程
  • 做301到别人网站wordpress 模板免费下载
  • 1688网站首页淘宝客建立网站推广怎么做
  • 广州网站建设网站优化推广电子产品外观设计
  • 建设银行的英语网站wordpress 自动发微博
  • 网页制作与网站建设实战大全pdf做甜品网站的需求分析
  • 莱芜网站优化加徽信xiala5效果好吉安网站建设343000
  • 南通网站排名台州关键词优化报价
  • 网络门户网站自己做的网站访问速度慢
  • 网站建设灰色关键词湛江市建设教育协会学校网站
  • 自己建个网站怎么挣钱网站制作公司网站
  • 做搜狗手机网站快网站建设外包兼职平台
  • wap站开发wordpress写插件吗
  • h5网站开发环境宜昌哪里有做网站的
  • 如何搭建aspx网站更多标签的下载方法
  • 网站建设服务费属于电子商务网站的建设收益
  • 全网营销整合推广百度上做优化一年多少钱
  • 网站建设wuliankj如何做网站嵌入腾讯地图
  • 律师网站建设培训班电商货源平台
  • 建设一个商城网站网络建设原则
  • 永久免费域名注册网站证书兼职的人才网站