`

不明觉厉的模板方法模式(Template Method Pattern)

阅读更多

啥是模板方法模式?好像很厉害的样子。

 

现有两种车,悍马H1和悍马H2,对它们进行测试,需要开动,停止,鸣笛,引擎声。这两车有四个相同的动作,但是动作的内容不同,最后的测试执行这四个动作,就是说测试是相同的。那我们这么设计如何?


这就是模板方法模式,是不是超简单!

 

<?php
abstract class HummerModel {
	protected abstract function start();
	protected abstract function stop();
	protected abstract function alarm();
	protected abstract function engineBoom();
	final public function run() {
		$this->start();
		$this->engineBoom();
		$this->alarm();
		$this->stop();
	}
}

class HummerH1Model extends HummerModel{
	protected function start() {
		echo "悍马H1启动\n";
	}

	protected function stop() {
		echo "悍马H1停止\n";
	}

	protected function alarm() {
		echo "悍马H1鸣笛\n";
	}

	protected function engineBoom() {
		echo "悍马H1引擎声\n";
	}
}

class HummerH2Model extends HummerModel{
	protected function start() {
		echo "悍马H2启动\n";
	}

	protected function stop() {
		echo "悍马H2停止\n";
	}

	protected function alarm() {
		echo "悍马H2鸣笛\n";
	}

	protected function engineBoom() {
		echo "悍马H2引擎声\n";
	}
}

$hummerH1 = new HummerH1Model();
$hummerH1->run();
$hummerH2 = new HummerH2Model();
$hummerH2->run();

?>
运行结果:
悍马H1启动
悍马H1引擎声
悍马H1鸣笛
悍马H1停止
悍马H2启动
悍马H2引擎声
悍马H2鸣笛
悍马H2停止
[Finished in 0.1s]

 

 

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

模板方法模式确实简单,仅仅使用了继承机制,但它是一个应用非常广泛的模式。其中,HummerModel叫做抽象模板,它的方法分为两类:

1.基本方法:

基本方法也叫基本操作,是由子类实现的方法,并且在模板方法被调用。

2.模板方法:

可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的高度,完成固定的逻辑。(为了防止恶意的操作,一般模板方法都加上final关键字,不允许被覆写)

 

继承HummerModel的HummerH1Model和HummerH2Model叫做具体模板,实现父类所定义的一个或多个抽象方法,也就是父类定义的基本方法在子类中得以实现。

 

抽象模板中的基本方法尽量设计为protected类型,符合迪米特法则,不需要暴露的属性或方法尽量不要设置为protected类型。实现类若非必要,尽量不要扩大父类 中的访问权限。

 

 

模板方法模式的优点:

1.封装不变部分,扩展可变部分。

把认为是不变的部分的算法封装到父类实现,而可变部分的则可以通过继承来继续扩展。在上面的例子中,如果现在增加一个H3型号,只要增加一个子类,实现父类的基本方法即可。

2.提供公共部分代码,便于维护。

3.行为由父类控制,子类实现。

基本方法是由子类实现的,因此子类可以通过扩展的方式增加相应的,符合开闭原则。

 

 

模板方法模式的缺点:

按照我们的设计习惯,抽象类负责声明最抽象、最一般的事情属性和方法,实现类完成具体的事物属性和方法。但是模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类实现,子类执行结果影响了父类的结果,也就是子类对父类产生了影响,这在复杂的项目中,会带来代码阅读的难度,而且也会让新手产生不适感。

 

 

模板方法模式的使用场景:

1.多个子类有公有的方法,并且逻辑基本相同时。

2.重要、复杂的算法,可以核心算法设计为模板算法,周边的相关细节功能则由各个子类实现。

3.重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。

 

 

模板方法模式的扩展:

如果上面的例子中现在H2型号悍马不要有鸣笛,该如何扩展?

 

在抽象模板中添加isAlarm设置是否需要鸣笛,具体模板添加setAlarm来设置,从而达到想鸣笛就鸣笛,不想就不呜的效果。抽象类中的isAlarm的返回值影响了模板方法的执行结果,该方法就叫做钩子方法(Hook Method)。

 

  • 大小: 10.4 KB
  • 大小: 5 KB
7
7
分享到:
评论

相关推荐

    Head First 设计模式 (八) 模板方法模式(Template Method pattern) C++实现

    模板方法模式是设计模式中的一种行为模式,它在软件工程中扮演着重要的角色,尤其是在C++这样的面向对象编程语言中。这种模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的...

    设计模式C++学习之模板方法模式(Template Method)

    模板方法模式(Template Method)是设计模式中行为型模式的一种,它定义了操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这个模式在C++编程中有着...

    模版方法模式TemplatePattern

    模板方法模式(Template Pattern)是设计模式中行为型模式的一种,它定义了操作中的算法骨架,而将一些步骤延迟到子类中。这种模式允许子类重新定义或改变某些基本操作,但整体结构和顺序保持不变。在Java编程中,...

    模板模式Template Pattern

    ### 模板模式 (Template Pattern) #### 一、概述 模板模式是一种常用的行为设计模式,其核心在于定义了一个算法的框架,并允许子类提供具体的实现细节。通过这种方式,子类可以继承并重写某些方法,但整个算法的...

    TemplateMethod Pattern.unitypackage

    TemplateMethod Pattern.unitypackage是一个模板方法模式的小栗子。

    模板方法模式(TemplateMethod)原理图

    模板方法模式是一种行为设计模式,它在一个方法中定义算法的骨架,将一些步骤延迟到子类中实现。 具体来说,模板方法模式的关键特点包括: 抽象类:在抽象类中定义一个模板方法,该方法给出了算法的框架。 具体...

    C#模板方法模式(Template Method Pattern)实例教程

    模板方法模式(Template Method Pattern)是一种行为设计模式,它允许在定义算法的框架时,将具体步骤延迟到子类中。这种模式的核心在于抽象类,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。子类可以...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    9、模板方法模式TEMPLATE METHOD PATTERN 10、建造者模式BUILDER PATTERN 11、桥梁模式BRIDGE PATTERN 12、命令模式COMMAND PATTERN 13、装饰模式DECORATOR PATTERN 14、迭代器模式ITERATOR PATTERN 15、组合...

    Discovering Template Method Pattern in Google Android framework

    模板方法模式(Template Method Pattern)在Google Android框架中的应用是一个重要的设计模式实例,它允许开发者定义一个算法骨架,而将一些步骤延迟到子类中。这个模式的关键在于它定义了一个操作中的算法步骤,并...

    template-method-demo 模板方法示例

    在"template-method-demo"这个示例中,我们可以预见到它将展示如何在Java中应用模板方法模式。这个压缩包可能包含以下内容: 1. 一个抽象类(例如:`AbstractClass`),它定义了模板方法。在这个类中,可能会有一个...

    python 模板方法模式(示例)

    设计模式——模板方法模式模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤使用场景:当不变和可...

    C++设计模式课件3_Template Method_模板方法.pdf

    模板方法模式(Template Method Pattern)是一种行为型设计模式,它允许我们定义算法的骨架,并将部分步骤推迟到子类中实现。这种模式使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。 #### 模式背景...

    C#版 24种设计模式

    工厂方法模式(Factory Method Pattern) 观察者模式(Observer Pattern) 建造者模式(Builder Pattern) 解释器模式(Interpreter Pattern) 命令模式(Command Pattern) 模板方法模式(Template Method Pattern) 桥接模式...

    设计模式-模板方法模式ppt

    ### 设计模式之模板方法模式解析 #### 一、引言 在软件开发过程中,我们经常面临这样的场景:有一些步骤是固定的,而某些步骤则可能因具体实现而异。为了解决这类问题,设计模式中引入了一种叫做“模板方法模式”的...

    C++设计模式代码资源3_Template Method_模板方法.zip

    在C++设计模式代码资源3_Template Method中,我们可以期待找到一个示例,展示如何在C++中实现模板方法模式。可能包含一个抽象类(如`GameCharacter`),定义了攻击动作的模板方法,以及几个子类(如`Warrior`和`Mage...

    设计模式之模板方法(Template)

    模板方法模式的核心是抽象类,它包含了模板方法,该方法定义了算法的基本结构,由一系列基本操作组成。这些基本操作可以是具体方法或钩子方法。具体方法是已经实现的方法,而钩子方法是空的方法,留给子类去实现。...

    11.设计模式-模板方法模式1

    模板方法模式(Template Method Pattern)是一种行为设计模式,它允许在父类中定义算法的框架,然后由子类提供具体的实现。这种模式的核心是“模板方法”,它在父类中定义了一个操作的步骤顺序,并将某些步骤声明为...

    模板方法模式案例代码

    模板方法模式是一种设计模式,属于行为设计模式,它在面向对象设计中扮演着重要的角色。这个模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法...

    设计模式--模板方法模式java例子

    模板方法模式是设计模式中行为型模式的一种,它在软件工程中扮演着非常重要的角色,尤其是在Java编程中。模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。它允许子类不改变一个算法的结构即可重...

    Python设计模式之模板方法模式实例详解

    模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 下面是一个模板方法模式的一个demo: #!/...

Global site tag (gtag.js) - Google Analytics