
模板方法模式是常用的Java设计模式,下面我重点详解模板方法模式的组件实现与应用场景@mikechen
模板方法模式定义
模板方法模式,全称是Template Method Pattern,是一种行为型设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。
模板方法模式允许,子类为一个算法的不同步骤提供不同的实现,而无需改变算法的结构。
模板方法模式设计
模板方法模式的类图,包含以下几个角色:

- 抽象类(Abstract Class):定义了一个模板方法,其中包含一些抽象方法和具体方法,它们表示一个算法的不同步骤,其中某些步骤可能需要由子类实现。
- 具体类(Concrete Class):继承抽象类,实现抽象方法,并重写模板方法中需要定制的部分。
通过抽象类和具体类之间的继承关系,模板方法模式将算法的骨架和具体实现分离开来,使得算法的实现可以在不同的子类中灵活定制和扩展。
同时,模板方法模式还可以避免子类重复实现相同的算法骨架,提高了代码的重用性和可维护性。
模板方法模式实现例子
假设我们正在编写一个电子商务平台,其中有不同的支付方式,如支付宝、微信支付、银行卡支付等。
每个支付方式的支付流程大体相同,都包括连接服务器、验证身份、扣款等步骤,但其中一些细节可能有所不同。
我们可以使用模板方法模式来实现这个支付流程,如下所示:
// 抽象支付类
public abstract class Payment {
// 模板方法,定义了支付流程的步骤
public final void pay() {
connectServer();
authenticate();
if (isAuthenticated()) {
deduct();
showPaymentResult();
} else {
showAuthError();
}
}
// 抽象方法,由子类实现不同的支付方式
protected abstract void deduct();
// 具体方法,所有支付方式共同实现的方法
protected void connectServer() {
System.out.println("Connect to payment server...");
}
// 具体方法,所有支付方式共同实现的方法
protected void authenticate() {
System.out.println("Authenticate payment...");
}
// 具体方法,所有支付方式共同实现的方法
protected boolean isAuthenticated() {
return true;
}
// 具体方法,所有支付方式共同实现的方法
protected void showPaymentResult() {
System.out.println("Payment success!");
}
// 具体方法,所有支付方式共同实现的方法
protected void showAuthError() {
System.out.println("Authentication failed!");
}
}
// 支付宝支付类
public class AliPay extends Payment {
@Override
protected void deduct() {
System.out.println("Deduct payment from Alipay account...");
}
}
// 微信支付类
public class WeChatPay extends Payment {
@Override
protected void deduct() {
System.out.println("Deduct payment from WeChat account...");
}
}
// 银行卡支付类
public class CardPay extends Payment {
@Override
protected void deduct() {
System.out.println("Deduct payment from bank card...");
}
}
模板方法模式应用场景
如果我们需要定义一个算法的骨架,同时允许子类实现某些步骤,而不改变算法的整体结构,那么可以考虑使用模板方法模式。
模板方法模式应用场景如下:
1.算法骨架固定,但具体实现可能会变化
当我们需要定义一个算法的框架,但具体的实现细节可能因应用的不同而变化时,可以使用模板方法模式。
2.多个类具有相同的算法结构
如果多个类具有相同的算法结构,但其中某些步骤的实现可能不同,可以使用模板方法模式来避免代码的重复。
3.针对复杂的流程或者业务逻辑
模板方法模式可以帮助我们将复杂的流程或业务逻辑分解为一系列步骤,从而更好地组织代码和管理逻辑。
4.框架开发
在框架开发中,我们通常需要定义一些基础类或接口,然后由客户端来实现具体的业务逻辑。
比如:Hibernate中的Template和Callback等,这时候模板方法模式可以帮助我们定义通用的算法骨架,从而减少客户端的工作量。
以上就是模板方法模式详解,更多设计模式请查看:Java设计模式:23种设计模式(万字图文全面总结)
mikechen睿哥
10年+一线大厂架构实战经验,就职于阿里、淘宝等一线大厂,操盘多个亿级大厂核心项目。