`

模板方法设计模式及其扩展

阅读更多

设计模式之禅学习之模板方法设计模式

 

1、模板方法设计模式相当简单,就是把相同的方法提取到抽象类中,平时也会经常用到,只是不知道这就是模板方法设计模式罢了

 

2、模板方法类:

package com.wang.templatePattern;

/**
 * 抽象模板类
 * @author HeJW
 *
 */
public abstract class AbstractClass {
	
	//基本方法
	protected abstract void  method1();
	protected abstract void  method2();
	protected abstract void  method3();
	
	//模板方法
	final public void templateMethod(){
		//调用基本方法,完成业务逻辑
		this.method1();
		this.method2();
		this.method3();
	}
	
	
}

 3、具体的模板,模板可以有多个,一下是一个例子:

package com.wang.templatePattern;

/**
 * 具体模板类1
 * @author HeJW
 *
 */
public class ConcreteClass1 extends AbstractClass {

	@Override
	protected void method1() {
		System.out.println("1 1");
	}

	@Override
	protected void method2() {
		System.out.println("1 2");
	}

	@Override
	protected void method3() {
		System.out.println("1 3");
	}

}

 另一个模板:

package com.wang.templatePattern;

/**
 * 具体模板类2
 * @author HeJW
 *
 */
public class ConcreteClass2 extends AbstractClass {

	@Override
	protected void method1() {
		System.out.println("2 1");
	}

	@Override
	protected void method2() {
		System.out.println("2 2");
	}

	@Override
	protected void method3() {
		System.out.println("2 3");
	}

}

 4、测试类

package com.wang.templatePattern;

public class App {
	
	public static void main(String[] args) {
		
		AbstractClass class1 = new ConcreteClass1();
		class1.templateMethod();
		
		AbstractClass class2 = new ConcreteClass2();
		class2.templateMethod();
		
	}
	
}

 5、模板方法设计模式的扩展,在抽象模板中定义的基本方法,在具体模板中,不一定都能够用到,还有可能用不用这个基本方法需要客户端决定,这时可以在抽象模板中定义钩子函数:

一个扩展的抽象模板:

package com.wang.templatePattern.develop;

/**
 * 抽象模板类
 * @author HeJW
 *
 */
public abstract class AbstractClass {
	
	//基本方法
	protected abstract void  method1();
	protected abstract void  method2();
	protected abstract void  method3();
	
	//模板方法
	final public void templateMethod(){
		//调用基本方法,完成业务逻辑
		this.method1();
		
		//根据条件判断这个方法执行不执行
		if ( this.condition() ) {
			this.method2();
		}
		
		this.method3();
	}
	
	//钩子函数
	protected boolean condition() {
		return true;
	}
	
}

 在类中可以看到,有一个钩子函数,该钩子函数能够决定基本方法是否执行,

以下是一个由客户端决定执不执行基本方法的具体模板类:

package com.wang.templatePattern.develop;

/**
 * 具体模板类1
 * @author HeJW
 *
 */
public class ConcreteClass1 extends AbstractClass {

	private boolean condition = true;
	
	//判断条件由客户端决定,默认执行
	public void setCondition( boolean condition ){
		this.condition = condition;
	}
	
	@Override
	protected boolean condition() {
		return this.condition;
	}

	@Override
	protected void method1() {
		System.out.println("1 1");
	}

	@Override
	protected void method2() {
		System.out.println("1 2");
	}

	@Override
	protected void method3() {
		System.out.println("1 3");
	}

}

 这样就可以在客户端中决定基本方法是否执行了。

一个测试类:

package com.wang.templatePattern.develop;

public class App {
	
	public static void main(String[] args) {
		
		ConcreteClass1 class1 = new ConcreteClass1();
		//不执行
		class1.setCondition(false);
		class1.templateMethod();
	
	}
	
}

 

1
1
分享到:
评论

相关推荐

    Java设计模式 版本2

    对象间的联动——观察者模式,处理对象的多种状态及其相互转换——状态模式,算法的封装与切换——策略模式,模板方法模式深度解析,操作复杂对象结构——访问者模式,设计模式与足球,多人联机射击游戏中的设计模式...

    Java中的设计模式及其分类.zip

    Java中的设计模式是一种在软件开发中解决特定问题的最佳实践或模板。它们是对常见设计问题的优秀解决方案的总结,通过复用这些设计模式,可以提高代码的可维护性、可重用性和可扩展性。 设计模式主要分为三大类:...

    设计模式,软件开发者必读

    设计模式的个人总结教材,适合IT专业人士研究,目录如下: 序言 概念 6 1.1 设计模式的定义 6 1.2 设计模式的作用 6 1.3 设计模式的由来 6 1.4 设计模式的分类 7 1.5 OO设计七原则 7 1.5.1 开-闭原则(OPEN-CLOSED ...

    design-pattern-java.pdf

    设计模式综合应用实例 设计模式综合应用实例 多人联机射击游戏 多人联机射击游戏中的设计模式应用(一) 多人联机射击游戏中的设计模式应用(二) 数据库同步系统 设计模式综合实例分析之数据库同步系统(一) 设计...

    Delphi 深度探索(第二版)〖含随书光盘源代码〗

    6.1 使用delphi实现设计模式 6.1.1 工厂模式 6.1.2 单例模式(singleton) 6.1.3 建造模式(builder) 6.1.4 原型模式(prototype) 6.2 结构模式 6.2.1 适配器模式(adapter) 6.2.2 合成模式...

    asp.net知识库

    .NET中的方法及其调用(一) 如何判断ArrayList,Hashtable,SortedList 这类对象是否相等 帮助解决网页和JS文件中的中文编码问题的小工具 慎用const关键字 装箱,拆箱以及反射 动态调用对象的属性和方法——性能和...

    UML和模式应用(架构师必备).part06.rar

    26.2 一些GRASP原则是对其他设计模式的归纳 26.3 设计中发现的“分析”:领域模型 26.4 工厂(Factory) 26.5 单实例类(GoF) 26.6 具有不同接口的外部服务问题的结论 26.7 策略(GoF) 26.8 组合(GoF)和...

    软件开发类投标项目全套解决方案模板

    3、 美观性:页面设计根据XXX航空整体UI设计思想为依据进行设计,使用户一目了然具备XXX航空的代表性和与其他航空公司的差异化,在此基础上进行深入设计,如根据季节设计清爽的界面、根据时下热播电影设计主题界面等...

    ASP.NET MVC 3高级编程

    11.1.1 设计模式—— 控制反转模式 264 11.1.2 设计模式—— 服务定位器 266 11.1.3 设计模式—— 依赖注入 270 11.2 依赖解析器的用法 272 11.2.1 单一注册服务 274 11.2.2 复合注册服务 275 11.2.3 创建任意...

    UML和模式应用(架构师必备).part02.rar

    26.2 一些GRASP原则是对其他设计模式的归纳 26.3 设计中发现的“分析”:领域模型 26.4 工厂(Factory) 26.5 单实例类(GoF) 26.6 具有不同接口的外部服务问题的结论 26.7 策略(GoF) 26.8 组合(GoF)和...

    庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术

    2.3.2 设计模式下的调试方法 20 2.4 javascript脚本调试方法 22 2.4.1 调试页面中的javascript脚本(方法一) 22 .2.4.2 调试页面中的javascript脚本(方法二) 23 2.4.3 调试非嵌入式javascript脚本文件 23 ...

    基于ssm+Vue的快递管理系统(源码+部署说明+系统介绍+数据库).zip

    该系统采用了前后端分离的设计模式,前端使用Vue.js框架进行开发,后端使用Spring+SpringMVC框架进行开发。 系统主要包括快递信息管理、订单管理等功能模块。用户可以注册账号,登录后查看快递信息、下单等操作。...

    Renesas RX微控制器、C++ 框架、库、示例_C++_代码_相关文件_下载

    瑞萨 RX 微控制器 ...具有模板设计模式的设备控制类提供了灵活而简洁的功能。 由于其功能性,它不需要通过单独的程序进行困难或复杂的设置或代码生成。 更多详情、使用方法,请下载后阅读README.md文件

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part1

    2.3.2 设计模式下的调试方法 20 2.4 javascript脚本调试方法 22 2.4.1 调试页面中的javascript脚本(方法一) 22 .2.4.2 调试页面中的javascript脚本(方法二) 23 2.4.3 调试非嵌入式javascript脚本文件 23 ...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part2

    2.3.2 设计模式下的调试方法 20 2.4 javascript脚本调试方法 22 2.4.1 调试页面中的javascript脚本(方法一) 22 .2.4.2 调试页面中的javascript脚本(方法二) 23 2.4.3 调试非嵌入式javascript脚本文件 23 ...

    庖丁解牛纵向切入ASP.NET 3.5控件和组件开发技术.pdf

    2.3.2 设计模式下的调试方法20 2.4 javascript脚本调试方法22 2.4.1 调试页面中的javascript脚本(方法一)22 .2.4.2 调试页面中的javascript脚本(方法二)23 2.4.3 调试非嵌入式javascript脚本文件23 2.4.4 ...

    UML和模式应用(架构师必备).part01.rar

    26.2 一些GRASP原则是对其他设计模式的归纳 26.3 设计中发现的“分析”:领域模型 26.4 工厂(Factory) 26.5 单实例类(GoF) 26.6 具有不同接口的外部服务问题的结论 26.7 策略(GoF) 26.8 组合(GoF)和...

    UML和模式应用(架构师必备).part07.rar

    26.2 一些GRASP原则是对其他设计模式的归纳 26.3 设计中发现的“分析”:领域模型 26.4 工厂(Factory) 26.5 单实例类(GoF) 26.6 具有不同接口的外部服务问题的结论 26.7 策略(GoF) 26.8 组合(GoF)和...

    UML和模式应用(架构师必备).part03.rar

    26.2 一些GRASP原则是对其他设计模式的归纳 26.3 设计中发现的“分析”:领域模型 26.4 工厂(Factory) 26.5 单实例类(GoF) 26.6 具有不同接口的外部服务问题的结论 26.7 策略(GoF) 26.8 组合(GoF)和...

Global site tag (gtag.js) - Google Analytics