定义:
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
例子:
继承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类型。实现类若非必要,尽量不要扩大父类中的访问权限。
模板方法模式的优点:
- 封装不变部分,扩展可变部分
- 提取公共代码,便于维护
- 行为由父类控制,子类实现。基本方法是由子类完成的,因此子类可以通过扩展的方式增加相应的功能,符合开闭原则。
模板方法模式的缺点:
按照我们的设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类完成具体的事物属性和方法。但是模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类实现,子类的执行结果却影响了父类的结果,也就是子类对父类产生了影响,这在复杂的项目中,会带来代码阅读的难度,而且也会让新手产生不适感。
模板方法模式的使用场景:
- 多个子类有公有的方法,并且逻辑基本相同时
- 只要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现
- 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为
分享到:
相关推荐
工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式...
模板方法模式是设计模式中的一种行为模式,它在软件工程中扮演着重要的角色,尤其是在C++这样的面向对象编程语言中。这种模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的...
工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10...
4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern...
工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式...
模板方法模式(Template Pattern)是设计模式中行为型模式的一种,它定义了操作中的算法骨架,而将一些步骤延迟到子类中。这种模式允许子类重新定义或改变某些基本操作,但整体结构和顺序保持不变。在Java编程中,...
**模板方法模式(Template Method Pattern)**是一种行为设计模式,它在面向对象编程中扮演着重要角色。在Java中,这种模式允许我们定义一个算法框架,而将具体步骤的实现延迟到子类中。模板方法模式是基于继承的,...
TemplateMethod Pattern.unitypackage是一个模板方法模式的小栗子。
设计模式——模板方法模式模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤使用场景:当不变和可...
模板方法模式(Template Method Pattern)是一种行为型设计模式,它允许我们定义算法的骨架,并将部分步骤推迟到子类中实现。这种模式使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。 #### 模式背景...
模板方法模式(Template Method Pattern)是一种行为设计模式,它允许在定义算法的框架时,将具体步骤延迟到子类中。这种模式的核心在于抽象类,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。子类可以...
9、模板方法模式TEMPLATE METHOD PATTERN 10、建造者模式BUILDER PATTERN 11、桥梁模式BRIDGE PATTERN 12、命令模式COMMAND PATTERN 13、装饰模式DECORATOR PATTERN 14、迭代器模式ITERATOR PATTERN 15、组合...
模板方法模式(Template Method Pattern)在Google Android框架中的应用是一个重要的设计模式实例,它允许开发者定义一个算法骨架,而将一些步骤延迟到子类中。这个模式的关键在于它定义了一个操作中的算法步骤,并...
模板方法模式(Template Method Pattern)是一种行为设计模式,它允许在父类中定义算法的框架,然后由子类提供具体的实现。这种模式的核心是“模板方法”,它在父类中定义了一个操作的步骤顺序,并将某些步骤声明为...
1. 模板方法模式(Template Method Pattern):在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。 2. 命令模式(Command Pattern):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化...
14. 模板方法模式(Template Method Pattern):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 15. 访问者模式(Visitor Pattern):表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各...
13. 模板方法模式(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到子类中,实现了基类的算法可复用。 行为型设计模式 14. 观察者模式(Observer Pattern):定义对象之间的一种一对多的依赖...
13. 模板方法模式(Template Method Pattern):使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 14. 命令模式(Command Pattern):将一个请求封装为一个对象,从而使你可用不同的请求对客户端...
13. 模板方法模式(Template Method Pattern):在子类中定义算法的特定步骤,保持算法骨架不变。 14. 命令模式(Command Pattern):将请求封装为对象,便于参数化不同请求,支持撤销操作等。 15. 责任链模式...
13. 模板方法模式(Template Method Pattern),在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。 14. 命令模式(Command Pattern),将请求封装为对象,从而使你可用不同的请求对客户端进行参数化。 15...