模板设计(templatePattern)模式

本文介绍模板设计模式的概念、结构及实现。重点讲解了抽象模板类和具体模板类的设计,包括模版方法、抽象方法和钩子方法等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 模板设计模式在书中定义:

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

二.模版方法模式的结构

       模版方法模式由一个抽象类和一个(或一组)实现类通过继承结构组成,抽象类中的方法分为三种:

  • 抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现。
  • 模版方法:由抽象类声明并加以实现。一般来说,模版方法调用抽象方法来完成主要的逻辑功能,并且,模版方法大多会定义为final类型,指明主要的逻辑功能在子类中不能被重写。
  • 钩子方法:由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。
  • 抽象类的任务是搭建逻辑的框架,通常由经验丰富的人员编写,因为抽象类的好坏直接决定了程序是否稳定性。

三.实现

    1.抽象模板类

package com.zqr.design.templatePattern;
import java.util.ArrayList;
/**
 * 抽象模板
    * @ClassName: AbsTemplate  
 */
public abstract class AbsTemplate {
	protected abstract void before();
	protected abstract void after();
	protected abstract boolean isEat();

	/**
	 * 	定义了一系列操作算法
	    * @Title: excute  
	    * @param @param sportCallBack:钩子函数,用于实现不同的细节操作
	 */
	private final <T> T excute(SportCallBack<T> sportCallBack) {
		System.out.println(sportCallBack.getName());
		before();
		T sport = sportCallBack.sport();
		after();
		if (isEat()) {
			System.out.println("吃东东,补充体力.....");
		}
		return sport;
	}
	/**
	 * 	对子类提供篮球运动
	    * @Title: playBasketBall  
	 */
	protected final <T> T playBasketBall(String name) {
		class BasketBall implements SportCallBack<T>{
			@Override
			public T sport() {
				System.out.println("打篮球.....");
				ArrayList<Object> nameLst = new ArrayList<>();
				nameLst.add(name);
				return (T) nameLst;
			}
			@Override
			public String getName() {
				return name;
			}
		}
		return excute(new BasketBall());
	}
	/**
	 * 	对子类提供足球运动
	    * @Title: playFootBall  
	 */
	protected final <T> T playFootBall(String name) {
		class FootBall implements SportCallBack<T>{
			@Override
			public T sport() {
				System.out.println("踢足球.....");
				ArrayList<Object> nameLst = new ArrayList<>();
				nameLst.add(name);
				return (T) nameLst;
			}
			@Override
			public String getName() {
				return name;
			}
		}
		return excute(new FootBall());
	}
}
   
package com.zqr.design.templatePattern;
/**
 * 	钩子接口,用于模板传参
    * @ClassName: SportCallBack  
 */
public interface SportCallBack<T> {
	T sport();
	String getName();
}

    2.具体模板类

package com.zqr.design.templatePattern;
import java.util.List;
/**
 * 	具体模板类:实现excute细节函数
    * @ClassName: ConcreteTemplate  
 */
public class ConcreteTemplate extends AbsTemplate{
	@Override
	protected void before() {
		System.out.println("热身.....");		
	}
	@Override
	protected void after() {
		System.out.println("休息.....");
	}
	@Override
	protected boolean isEat() {
		return true;
	}
	/**
	 * 	对外提供篮球运动
	    * @Title: basketBallPlay  
	 */
	public void basketBallPlay(String name) {
		playBasketBall(name);
	}
	/**
	 * 	对外提供足球运动
	    * @Title: footBallPlay  
	 */
	public List<Object> footBallPlay(String name) {
		return playFootBall(name);
	}
}

    3.test



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值