设计模式之模板方法模式(Template Method Pattern)

本文深入探讨了模板方法设计模式的定义、结构和优点,通过DNF游戏登录流程的实例,详细展示了如何使用模板方法模式简化重复代码,提高代码复用性和可维护性。

其实模板方法在我们平时工作使用的非常频繁,但是没有学习过设计模式的小伙伴可能不是很清楚模板方法的定义是什么,即使是自己一直在用。

  • 模板方法模式定义
    Define the skeleton of an operation,deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure. 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定的步骤。
  • 模板方法模式通用类图
    在这里插入图片描述
  • 模板方法模式通用代码
    抽象模板类
public abstract class AbstractClass {

	protected abstract void otherMethod();
	
	public void templateMethod() {
		this.otherMethod();
	}
}

具体实现类

public class ConcreteClass extends AbstractClass{

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

场景类

public class Clinet {

	public static void main(String[] args) {
		ConcreteClass c = new ConcreteClass();
		c.templateMethod();
	}
}
  • 模板方法模式实例
    相信很多小伙伴都喜欢玩游戏吧,我比较喜欢玩DNF,所以就用DNF来举个例子吧。假设有A和B两个小伙伴都喜欢玩DNF,但是每次都需要打开电脑,打开游戏客户端,登录游戏。其实这部分的流程是重复的,只有游戏登录之后才是不同的,想怎么玩怎么玩。
    实例类图
    在这里插入图片描述
    实例代码,首先抽象一个DNFHelper
public abstract class DNFHelper {

	void openPC() {
		System.out.println("打开电脑...");
	};

	void openDNFClient() {
		System.out.println("打开DNF客户端...");
	}

	void loginDNF() {
		System.out.println("登录DNF账号...");
	}

	abstract void play();

	void process() {
		this.openPC();
		this.openDNFClient();
		this.loginDNF();
		this.play();
	}
}

然后实例化两个玩家

public class PlayerA extends DNFHelper{

	@Override
	void play() {
		System.out.println("玩家A开始玩DNF...");
	}
}
public class PlayerB extends DNFHelper{

	@Override
	void play() {
		System.out.println("玩家B开始玩DNF...");
	}
}

然后开始玩游戏

public class Client {

	public static void main(String[] args) {
		PlayerA playA = new PlayerA();
		playA.process();
		System.out.println("-------------");
		PlayerB playB = new PlayerB();
		playB.process();
	}
}

输出结果

打开电脑...
打开DNF客户端...
登录DNF账号...
玩家A开始玩DNF...
-------------
打开电脑...
打开DNF客户端...
登录DNF账号...
玩家B开始玩DNF...

自从有了这个DNFHelper之后,玩家终于做到可以直接开始玩游戏了,是不是很爽。

  • 模版方法模式的结构
    • 抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现。
    • 模版方法:由抽象类声明并加以实现。一般来说,模版方法调用抽象方法来完成主要的逻辑功能,并且,模版方法大多会定义为final类型,指明主要的逻辑功能在子类中不能被重写。
    • 钩子方法:由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。
  • 模板方法模式的优点
    • 行文是由父类控制的,子类负责实现。
    • 比较灵活,因为有钩子方法,因此,子类的实现也可以影响父类中主逻辑的运行。
    • 便于维护,符合开闭原则。
    • 一般多个子类有公有的方法,并且逻辑基本相同的时候,模板方法模式很好用。

参考书籍:设计模式之禅
实例代码放在这里

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值