`
wangwengcn
  • 浏览: 172981 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

4.模板方法模式(Template Method Pattern)

阅读更多

 

定义:

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

 

例子:

继承Thread实现一个多线程类时,我们重写了run方法,然后调用start方法,start方法定义在父类中,会调用子类中的run方法,是模板方法模式的典型应用。

 

特点:

把不变的行为搬到超类,去除子类中重复的代码来体现他的优势。

 

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

  • 基本方法:也叫基本操作,是由子类实现的方法,并且在模板方法中被调用。
  • 模板方法:可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。

为了防止恶意的操作,一般模板方法都加上final关键字,不允许被子类重写。

 

下面请看该模式的通用代码:

 

模板类:

package _4TemplateMethodPattern;

public abstract class AbstractTemplate {

	// 基本方法
	protected abstract void doSomeThing();
	
	// 基本方法
	protected abstract void doAnyThing();
	
	// 模板方法,基本方法的实现交给子类完成
	// 为了防止本方法被子类类修改,一般设置为final
	public final void templateMethod()
	{
		doSomeThing();
		doAnyThing();
	}
}

 

实现类1:

 

package _4TemplateMethodPattern;

public class Template1 extends AbstractTemplate {

	@Override
	protected void doSomeThing() {
		System.out.println("Template1.doSomeThing");
	}

	@Override
	protected void doAnyThing() {
		System.out.println("Template1.doAnyThing");
	}

}

 

实现类2:

 

package _4TemplateMethodPattern;

public class Template2 extends AbstractTemplate {

	@Override
	protected void doSomeThing() {
		System.out.println("Template2.doSomeThing");
	}

	@Override
	protected void doAnyThing() {
		System.out.println("Template2.doAnyThing");
	}

}

 

 

Client类:

 

 

package _4TemplateMethodPattern;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		AbstractTemplate a1 = new Template1();
		AbstractTemplate a2 = new Template2();
		a1.templateMethod();
		a2.templateMethod();
	}

}

 

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

 

模板方法模式的优点:

  1. 封装不变部分,扩展可变部分
  2. 提取公共代码,便于维护
  3. 行为由父类控制,子类实现。基本方法是由子类完成的,因此子类可以通过扩展的方式增加相应的功能,符合开闭原则。

模板方法模式的缺点:

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

 

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

  1. 多个子类有公有的方法,并且逻辑基本相同时
  2. 只要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现
  3. 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为
分享到:
评论

相关推荐

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

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

    C#设计模式_设计模式_C#_

    工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式...

    C#设计模式(23种设计模式)

    工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10...

    23种设计模式 (创建型,结构型,行为型)

    工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10...

    设计模式代码——c#

    4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern...

    Java设计模式,并加上个人理解

    8. 模板方法模式 (Template Pattern) 9. 建造者模式 (Builder Pattern) 10. 原型模式 (Prototype Pattern) 11. 组合模式 (Composite Pattern) 12. 装饰者模式 (Decorator Pattern) 13. 访问者模式 ...

    32种设计模式

    工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式...

    TemplateMethod Pattern.unitypackage

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

    python 模板方法模式(示例)

    设计模式——模板方法模式模板方法模式(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、组合...

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

    主要介绍了C#模板方法模式(Template Method Pattern),以实例形式讲述了C#抽象类模板方法的用法,具有很高的实用价值,需要的朋友可以参考下

    HE23DesignPatterns.zip

    C# 23种设计模式,包括1....模板方法模式(Template Method Pattern)5.建造者模式(Builder 6.代理模式(Proxy Pattern)Pattern)7.原型模式(Prototype Pattern)8.中介者模式 9.命令模式 等设计模式

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

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

    24种设计模式与6大设计原则

    模板方法模式[TEMPLATE METHOD PATTERN] 建造者模式[BUILDER PATTERN] 策略模式 代理模式 单例模式 多例模式 工厂方法模式 抽象工厂模式 门面模式 适配器模式 模板方法模式 建造者模式 桥梁模式 命令模式 装饰模式 ...

    C#版 24种设计模式

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

    C#23种设计模式

    4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. ...

    Java设计模式

    第 9 章 模板方法模式【TEMPLATE METHOD PATTERN】 ..........................................................................63 第 10 章 建造者模式【BUILDER PATTERN】 .......................................

    设计模式PPT

    创建型模式用来处理对象的创建过程,主要包含以下5种设计模式:  工厂方法模式(Factory Method Pattern)  抽象工厂模式... 模板方法模式(Template Method Pattern)  访问者模式(Visitor Pattern)

    JAVA设计模式.rar

    模板方法模式【TEMPLATE METHOD PATTERN】  建造者模式【BUILDER PATTERN】 桥梁模式【BRIDGE PATTERN】  命令模式【COMMAND PATTERN】  装饰模式【DECORATOR PATTERN】 迭代器模式【ITERATOR ...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm”供参考。 注:项目在 VS2008 下...模板方法模式(Template Method) 访问者模式(Visitor)

Global site tag (gtag.js) - Google Analytics