【设计模式】模板方法模式
官方解释:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
设计模式大咖闫宏解释:模板方法模式是类的行为型模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。
【模板类图】可以看出,模板方法模式由两部分组成:
(1) 抽象类(AbstractClass):抽象类实现了模板方法,定义了算法的框架,其中的方法可以是具体方法也可以是抽象方法(其中抽象方法称为基本操作,算法的框架称为模板方法)。
(2) 具体子类(ConcreteClass):继承抽象类,实现了抽象类中的抽象方法从而完成子类特定的算法,也可以选择是否重写父类中的具体方法。
【模板方法的代码实现】模板抽象类的实现方法包括三种,分别为:
(1)抽象方法:由抽象类声明,由具体子类实现。
(2)具体方法:具体方法由抽象类声明并实现,而子类并不实现或置换。
(3)钩子方法:钩子方法是由抽象类声明并实现,子类会选择是否应用或是否加以扩展。钩子方法一般有两种实现方式。第一种方式是由抽象类给出空实现,即像下边一样:
模板方法模式应用场景十分广泛。
在《Head First》的模板方法模式章节里列举了一个十分具有代表性的例子。现实生活中,茶和咖啡是随处可见的饮料。冲泡一杯茶或冲泡一杯咖啡的过程是怎样的?
我们来整理一下流程。
由以上处理步骤不难发现,准备这两种饮料的处理过程非常相似。我们可以使用模板类方法去限定制作饮料的算法框架。
其中相同的具有共性的步骤(如烧开水、倒入杯中),直接在抽象类中给出具体实现。
而对于有差异性的步骤,则在各自的具体类中给出实现。
System.out.println("============= 准备茶 ============="); Beverage tea = new Tea(); tea.prepareBeverage(); System.out.println("============= 准备咖啡 ============="); Beverage coffee = new Coffee(); coffee.prepareBeverage();
容易扩展。一般来说,抽象类中的模版方法是不易反生改变的部分,而抽象方法是容易反生变化的部分,因此通过增加实现类一般可以很容易实现功能的扩展,符合开闭原则。
便于维护。对于模版方法模式来说,正是由于他们的主要逻辑相同,才使用了模版方法,假如不使用模版方法,任由这些相同的代码散乱的分布在不同的类中,维护起来是非常不方便的。
比较灵活。因为有钩子方法,因此,子类的实现也可以影响父类中主逻辑的运行。但是,在灵活的同时,由于子类影响到了父类,违反了里氏替换原则,也会给程序带来风险。这就对抽象类的设计有了更高的要求。
在多个子类拥有相同的方法,并且这些方法逻辑相同时,可以考虑使用模版方法模式。在程序的主框架相同,细节不同的场合下,也比较适合使用这种模式。
浅析设计模式4——模板方法模式 我们在进行软件开发时要想实现可维护、可扩展,就需要尽量复用代码,并且降低代码的耦合度。设计模式就是一种可以提高代码可复用性、可维护性、可扩展性以及可读性的解决方案。大家熟知的23种设计模式,可以分为创建型模式、结构型模式和行为型模式三大类。本专题着眼于实际开发过程中常用的几种设计模式,从理论和实战两个角度进行讨论和分享,力求逻辑清晰、表述简洁,帮助大家在项目中合理运用设计模式,保障代码的可靠性。 本文为此系列第四篇文章,前三篇见—— 第一篇:浅析设计模式1 —— 工厂模式 第二篇:浅析设计模式2 —— 策略模式 第三篇:浅析设计模式3 —— 装饰者模式
设计模式之模板模式 模板模式:一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 这种类型的设计模式属于行为型模式。定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
设计模式-23-模板模式 模板模式(Template Pattern)就是在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中,使得子类可以在不改变一个算法的结构前提下即可重定义该算法的某些特定步骤。
【设计模式】Java设计模式 - 策略模式 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
【设计模式】C#实现模板方法模式 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
相关文章
- 设计模式——模板方法
- laravel5.1框架基础之Blade模板继承简单使用方法分析
- java实现洛谷P3376【模板】网络最大流
- 第二百五十八节,Tornado框架-逻辑处理get()方法和post()方法,初识模板语言
- 模板方法模式templeteMethod
- 《Android源码设计模式》--模板方法模式
- 使用模板元编程快速的得到斐波那契数。。
- Template Method 模板方法 MD
- 简介Python设计模式中的代理模式与模板方法模式编程
- 《Android源码设计模式》--模板方法模式
- 模板方法(钩子函数)设计模式
- ABAP,Java,JavaScript里的字符串模板String Template
- 模板形参包的展开方法
- thinkphp在前端页面的js代码中可以使用 U方法吗? 可以使用模板变量如__URL__等吗?
- 设计模式(Python语言)----模板方法模式
- 【设计模式】模板方法模式--让你的代码更具灵活性与可扩展性
- 大数据之Hadoop3.x模板虚拟机配置图解