模板方法模式定义
模板方法模式(Template Method Pattern):定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法是一种类行为型模式。
从模型图来看,模板方法模式很简单,但是很常用。抽象模板(AbstractClass)中的方法基本分两类:
-
基本方法:子类去实现的方法 ,并且在模板方法中被调用。
-
模板方法:把基本操作方法组合在一起形成一个总算法或一个总行为的方法;一个抽象类可以有任意多个模板方法,而不限于一个。每一个模板方法都可以调用任意多个具体方法。
而具体模板(ConcreteClass)主要是实现父类定义的抽象的基本方法。
模板方法模式实例+扩展
例子:给两种手机做测试的,测试包括“开机,检查,关机”三种操作。下面用具体的代码来说明:
1.抽象类
public abstract class TestModel {
//开机
protected abstract void open();
//检查
protected abstract void check();
//关闭
protected abstract void close();
//模板方法-测试
public void test(){
this.open();;
this.check();
this.close();
}
}
2.两个实现类Phone1,Phone2
public class Phone1 extends TestModel {
@Override
protected void open() {
System.out.println("phone1的开机逻辑");
}
@Override
protected void check() {
System.out.println("phone1的检查逻辑");
}
@Override
protected void close() {
System.out.println("phone1的关机逻辑");
}
}
public class Phone2 extends TestModel {
@Override
protected void open() {
System.out.println("phone2的开机逻辑");
}
@Override
protected void check() {
System.out.println("phone2的检查逻辑");
}
@Override
protected void close() {
System.out.println("phone2的关机逻辑");
}
}
3.调用
TestModel testModel1=new Phone1();
TestModel testModel2=new Phone2();
testModel1.test();
testModel2.test();
运行的结果如下:
二.扩展
如果phone1在测试中需要关机,而phone2不需要关机,这时需要一个钩子方法。
1.抽象类
public abstract class TestModel {
//开机
protected abstract void open();
//检查
protected abstract void check();
//关闭
protected abstract void close();
//模板方法-测试
public void test(){
this.open();;
this.check();
if (isClose()){
this.close();
}
}
//钩子方法,默认是关机
protected boolean isClose(){
return true;
}
}
2.实现类
public class Phone1 extends TestModel {
public boolean isClose=true;
public void setIsClose(boolean isClose){
this.isClose=isClose;
}
protected boolean isClose(){
return this.isClose;
}
@Override
protected void open() {
System.out.println("phone1的开机逻辑");
}
@Override
protected void check() {
System.out.println("phone1的检查逻辑");
}
@Override
protected void close() {
System.out.println("phone1的关机逻辑");
}
}
public class Phone2 extends TestModel {
@Override
protected void open() {
System.out.println("phone2的开机逻辑");
}
@Override
protected void check() {
System.out.println("phone2的检查逻辑");
}
@Override
protected void close() {
System.out.println("phone2的关机逻辑");
}
//因为是取消关机,所以直接返回false就可以了
protected boolean isClose(){
return false;
}
}
3.调用
Phone1 testModel1=new Phone1();
Phone2 testModel2=new Phone2();
//phone1
testModel1.setIsClose(true);
testModel1.test();
//phone2
testModel2.test()
模板方法模式的优缺点及应用
1.优点
-
封装不变部分,扩展可变的部分。
-
提取了公共的代码,减少代码量,方便维护。
-
父类控制方法,子类去实现。
2.缺点
-
代码的阅读难度会增加,尤其是新手。我们习惯认为抽象类申明的是最抽象的、最一般的事物属性和方法,实现类完成具体的事物属性和方法;而在模板方法模式中,抽象类中定义了部分抽象方法,而子类实现父类后执行的结果影响了父类,子类对父类产生了影响。
3.应用
-
重构
-
规定算法
-
抽取公共的逻辑
参考资料《大话设计模式》《设计模式之禅》
推荐阅读
相关推荐
Gang of Four)的经典著作《设计模式:可复用面向对象软件的基础》中的分类,包括创建型模式(如工厂模式、抽象工厂模式、单例模式等)、结构型模式(如适配器模式、桥接模式、装饰模式等)和行为型模式(如策略模式...
《Java与模式-清晰书签版》是一份包含多种Java设计模式详解的资源包,旨在帮助开发者深入理解和应用设计模式。这份资源集成了多种格式的文档,包括详细的文本描述、图表解析以及实际代码示例,使得学习过程更加直观...
9. **模板方法模式**:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 10. **命令模式**:将一个请求封装为一个对象,从而使你...
- **模板方法模式**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 - **观察者模式**:定义对象间的一种一对多的依赖关系,当一...
在软件开发过程中,模板(Template)和设计模式(Design Pattern)是两个重要的概念。模板主要用于简化代码编写过程中的重复工作,提高编码效率;而设计模式则侧重于解决常见的软件设计问题,提供经过验证的解决方案...
很适合初学软件设计模型,总结的很全,简单通俗易懂 5个创建模式: 1、Abstract Factory 抽象工厂 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 2、Builder 生成器 将一个复杂对象的...
- **行为型模式**:侧重于对象之间的职责分配以及通信机制,如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、中介者模式...
- **定义**: 学术答辩PPT模板是指用于学术答辩过程中展示研究成果的一种幻灯片设计模式。它通常包含特定的布局、样式以及必要的结构元素,如目录页、背景介绍、文献综述、理论框架、研究方法等。 - **作用**: 学术...
- 将Ajax功能与Smarty模板结合的方法。 6. **Ajax及WebControls操作篇** - FleaPHP中的Ajax类介绍。 - WebControls的开发实践。 - 高级Ajax功能实现案例。 7. **高级开发篇** - 高级开发技巧分享。 - 如何...
《iOS 7 Kit:欧美扁平化网页PSD模板与UI设计详解》 在现代互联网设计领域,扁平化设计风格已经成为主流趋势,特别是在iOS 7发布后,这种设计理念得到了广泛应用。"ios-7-kit_欧美扁平化网页PSD模板美工UI整站.zip...
- **模板开发简便**:PULL模式下的模板设计相对直观,降低了报表开发的复杂度。 #### PUSH模式解析 PUSH模式,即推模式,与PULL模式相反,它要求应用程序先行从数据库获取数据,再将这些数据推送至水晶报表引擎。...
layui的API设计简单易懂,使得开发者能够快速上手。 2. 前端技术栈: 本模板系统主要使用javascript和ecmascript作为脚本语言,javascript用于处理页面交互逻辑,而ecmascript(ES6及以上版本)则引入了更现代的...
在iOS开发中,单例模式是一种常见的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。Swift3中,有四种主要的实现单例模式的方法。这些方法各有优缺点,适应不同的场景需求。以下是对这四种单例模式的...
- **单图设计模式**:推出单图设计模式,简化设计步骤,提高工作效率。 - **图纸批量处理工具**:增强了图纸的批量打印与处理功能。 - **云技术集成**:利用互联网云技术,集成了元件参数化在线选型、户箱选型设计、...
14. **设计模式**:学习常见的设计模式如单例、工厂、观察者等,能提高代码的可读性和可维护性。 以上只是Java编程的基础知识,实际学习过程中,还需要结合具体的项目实践,不断地进行编码、调试和优化,才能真正...
- 设计模式是软件工程中解决问题的常见模板,如单例模式、工厂模式、观察者模式等。 - 通过实例解释了每种设计模式的动机、结构和实现方式。 - 说明了如何在实际项目中灵活运用设计模式,以提高代码的可维护性和...
**Laravel 开发与 Laravel-AdminLTE 模板详解** Laravel 是一款广泛使用的开源 PHP 框架,以其优雅的语法和强大的功能深受开发者喜爱。在 Laravel 的生态系统中,`laravel-adminlte` 是一个基于 AdminLTE 主题的...