Design Pattern: Template Method 模式

简介:

  学习是分享和合作式的!

转载请注明出处:http://blog.csdn.net/wdzxl198/article/details/9223275

文章摘自: http://www.riabook.cn/doc/designpattern/

不要将设计模式想得高不可攀,好像高手才会使用的东西,事实上如果您在下手程式之前,能稍稍对程式作个分析规划,或多或少都会用到一些模式了,模式不是教条,它只是前人的经验成果,而 Gof 的书则是择前人之精华持续改进而来罢了。
Template Method模式就是一个很简单的模式,但可能是使用最广泛的模式,也许您也一直在使用这样的模式,看它的 UML 类别结构图就知道了:

TemplateMethod

仅仅是抽象类别与具体类别实作的关系而已,有些人常问抽象类别与介面的区别为何,Template Method模式可以提供其中一个答案,例如:

  • AbstractClass.java
   1: public abstract class AbstractClass { 
   2:     public void templateMethod() { 
   3:         // step by step template to solve something 
   4:         // implementor should follow those step 
   5:         opStep1(); 
   6:         opStep2(); 
   7:         opStep3(); 
   8:     } 
   9:  
  10:     public abstract void opStep1(); 
  11:     public abstract void opStep2(); 
  12:     public abstract void opStep3(); 
  13: } 
  • ConcreteClass.java
   1: public class ConcreteClass extends AbstractClass { 
   2:     public abstract void opStep1() { 
   3:         // implement the real operation 
   4:     } 
   5:  
   6:     public abstract void opStep2() { 
   7:         // implement the real operation 
   8:     } 
   9:  
  10:     public abstract void opStep3() { 
  11:         // implement the real operation 
  12:     } 
  13: }
对于一些程式而言,我们希望规定一些处理的步骤、流程或骨架,就像是上例中的step1到step3一样,至于流程中的step1到step3如何实作并不规定,而留给实作的人自行决定,这就是Template Method模式的目的。
抽象类别与介面的差别之一,也正在于抽象类别可以先实作其中一些方法,而介面则是完全仅规定接口,使用Template Method模式就可以看出两者之间在应用上的一个差别。
仅以step1到step3这样的操作来看Template Method模式,似乎彰显示不出其实作骨架,而将实作部份留待子类的实用性,在 Gof 书中所举的例子是与 Factory Method 模式 结合的一个例子;通常开启一个档案的流程是相似的,例如文字档或二进位档,不外乎检查档案是否可开启、读取档案、设定显示等流程,可以使用 Template Method模式来规范这个流程: 
   1: public abstract class Application {
   2:     // .....
   3:     public void openDocument(String name) {
   4:         // Template Method
   5:         if(!canOpenDocument(name)) { // unable to open file
   6:             // show error message, throw exception
   7:             return;
   8:         }
   9:         Document doc = createDocument(); // Factory Method
  10:         if(doc != null) {
  11:             _docs.addDocument(doc);
  12:             // Template Method
  13:             aboutToOpenDocument(doc);
  14:              doc.open();
  15:              doc.doRead();
  16:         }
  17:     }
  18:     // Factory Method
  19:     public abstract Document createDocument();
  20:     // Template Method
  21:     public abstract boolean canOpenDocument(String name);
  22:     public abstract void aboutToOpenDocument(Document doc);
  23:  }
  24:  public class MyApplication extends Application {
  25:     // implement Factory Method
  26:     public void Document createDocument() {
  27:         return new MyDocument();
  28:     }
  29:     // implement Template Method
  30:     public void boolean canOpenDocument(String name) {
  31:         // implemented code here
  32:     }
  33:     public void aboutToOpenDocument(Document doc) {
  34:         // implemented code here
  35:     }
  36:  }

Factyro Method模式将实际要创建的物件推迟至子类中决定,而 Template Method模式则是将流程框架的实作留待子类来解决,事实上在这个例子中,您也可以将createDocument()看作是Template Method模式中的一个方法,从物件创建的角度来看它是Factory Method,而从流程框架的角度来看,它则是Template Method模式的一个方法实作。

Edit by Atlas,

Time:08:00

目录
相关文章
|
监控 Cloud Native 容器
基于阿里云容器服务监控 Kubernetes集群GPU指标
### 简介 当您在阿里云容器服务中使用GPU ECS主机构建Kubernetes集群进行AI训练时,经常需要知道每个Pod使用的GPU的使用情况,比如每块显存使用情况、GPU利用率,GPU卡温度等监控信息,本文介绍如何快速在阿里云上构建基于Prometheus + Grafana的GPU监控方案。
17008 0
|
机器学习/深度学习 人工智能 搜索推荐
AIGC的五个特点
【1月更文挑战第11天】AIGC的五个特点
1473 3
AIGC的五个特点
|
11月前
|
程序员 开发者
30 + 程序员的职场渡劫,差点被裁后我翻身了
阿飞,30+的一线城市程序员,在互联网公司工作五年后遭遇裁员危机和高强度加班。使用飞算JavaAI后,工作效率大幅提升,不仅告别了无效加班,还获得了领导的认可与晋升机会。业余时间增多,生活品质提高。现推荐参加“飞算JavaAI炫技大赛”,低门槛高奖励,参赛即有机会赢取丰厚奖品,释放编程潜力。
|
11月前
|
监控 API 数据处理
速卖通商品数据尽在掌握:揭秘高效利用API接口获取详情策略
速卖通(AliExpress)API助力电商数据处理与分析,提供商品搜索、价格监控等功能。开发者需注册账号、创建应用并获取API Key。常用接口包括商品搜索和详情API。调用时注意频率限制、数据延迟及错误处理。本文介绍全过程并附Python示例代码,帮助提升电商运营效率。
|
JSON 缓存 JavaScript
NPM 使用介绍
NPM 使用介绍
463 1
|
人工智能 API 开发者
用 OpenVINO™ 部署 GLM-Edge 全家桶
11月29日,智谱发布了GLM-Edge系列模型,包括GLM-Edge-1.5B-Chat、GLM-Edge-4B-Chat、GLM-Edge-V-2B、GLM-Edge-V-5B,适用于手机、车机及PC平台。文章介绍了如何使用OpenVINO™工具套件在本地部署这些模型,实现高效的AI任务处理,如聊天与图像理解。提供了详细的环境配置、模型转换与量化、以及具体的应用示例。
401 16
|
缓存 负载均衡 安全
什么是反向代理
反向代理是一种部署在服务器前端的代理技术,它接收客户端请求并转发给内部服务器,对外隐藏真实服务器。其主要功能包括负载均衡、安全防护和缓存加速,有效提升服务器性能和安全性。
723 5
|
监控 数据可视化 Java
监控堆外JConsole
监控堆外JConsole
138 4
|
机器学习/深度学习 人工智能 自然语言处理
智能语音识别技术在多语言环境下的挑战与优化策略###
随着全球化的加速推进,智能语音识别技术作为人机交互的关键一环,其跨语言适应性成为了研究热点。本文深入探讨了智能语音识别技术在多语言环境下面临的挑战,包括口音差异、词汇多样性、语法结构复杂性等,并提出了相应的优化策略。通过对比分析不同算法和技术路线,本文旨在为提升智能语音识别系统的跨语言性能提供理论依据和实践指导。 ###
|
存储 供应链 安全
StarTowerChain:DePIN 引领下的区块链璀璨之星
StarTowerChain 是基于 DePIN 理念的区块链项目,通过将分散的智能设备转化为强大节点,实现资源共享与协作。它采用先进的加密技术和分布式存储,确保数据安全和系统稳定性。StarTowerChain 应用于数字货币交易、供应链金融和物联网等领域,提供安全、高效的服务,并通过社区参与推动持续创新。