Java设计模式之浅谈模板方法模式
什么是模板方法模式?
模板方法模式(Template Method Pattern)是一种行为型设计模式,它将一个算法的森步骤封装到一个抽象类中,并且使用一组抽象方法定义规定了算法的框架结构,从而使得算法的具体实现延迟到子类中去实现。模板方法是一种简单但是非常实用的模式,因为它把不变项与变化项隔离开来,提高了代码的可复用性和维护性。
模板方法模式的组成
抽象类(Abstract Class)
抽象类定义了模板方法的骨架,其中包含了一个处理流程和其他一些方法(通常是抽象方法、具体方法和钩子方法),这些方法将交由子类来完成。
具体子类(Concrete Class)
具体子类通过继承抽象类,来完成其中定义的不同实现方法,同时可以添加新的方法。
示例1:冲调用饮料
具体场景:做一杯饮料,有咖啡和茶两种选择,而不同的咖啡和茶的冲泡方法也各不相同。
首先,我们定义一个抽象类Beverage
,其中定义了模板方法prepareBeverage()
,其中包含了两个具体方法boilWater()
和pourInCup()
以及一些抽象方法brew()
和addCondiments()
;
public abstract class Beverage {
// 模板方法
public final void prepareBeverage() {
boilWater();
brew();
pourInCup();
addCondiments();
}
// 公共方法
public void boilWater() {
System.out.println("Boiling water...");
}
// 公共方法
public void pourInCup() {
System.out.println("Pouring the beverage into cup...");
}
// 抽象方法
public abstract void brew();
// 抽象方法
public abstract void addCondiments();
}
接下来,我们定义咖啡和茶的具体子类,继承自抽象类Beverage
,完成其抽象方法,并可添加自己的方法。
具体子类Coffee
:
public class Coffee extends Beverage {
// 具体实现方法
public void brew() {
System.out.println("Brewing coffee...");
}
// 具体实现方法
public void addCondiments() {
System.out.println("Adding sugar and milk...");
}
// 新增方法
public void stir() {
System.out.println("Stirring...");
}
}
具体子类Tea
:
public class Tea extends Beverage {
// 具体实现方法
public void brew() {
System.out.println("Brewing tea...");
}
// 具体实现方法
public void addCondiments() {
System.out.println("Adding lemon...");
}
// 新增方法
public void steep() {
System.out.println("Steeping...");
}
}
最后,测试类TemplateMethodDemo
,创建具体实例,调用其模板方法prepareBeverage()
即可。
public class TemplateMethodDemo {
public static void main(String[] args) {
Beverage coffee = new Coffee();
System.out.println("Making coffee...");
coffee.prepareBeverage();
((Coffee) coffee).stir();
Beverage tea = new Tea();
System.out.println("Making tea...");
tea.prepareBeverage();
((Tea) tea).steep();
}
}
输出结果:
Making coffee...
Boiling water...
Brewing coffee...
Pouring the beverage into cup...
Adding sugar and milk...
Stirring...
Making tea...
Boiling water...
Brewing tea...
Pouring the beverage into cup...
Adding lemon...
Steeping...
示例2:银行开户流程
具体场景:银行开户流程,分为五个步骤:填写申请表、审核申请、审批通过、填写合同并签署、完成银行卡发放。
首先,定义一个抽象类Account
,其中定义了模板方法openAccount()
,其中包含了四个具体方法以及一个抽象方法fillApplication()
;
public abstract class Account {
// 模板方法
public final void openAccount() {
fillApplication();
checkApplication();
approveApplication();
writeContract();
issueCard();
}
// 具体实现方法
public void checkApplication() {
System.out.println("Checking the application...");
}
// 具体实现方法
public void approveApplication() {
System.out.println("Approving the application...");
}
// 具体实现方法
public void writeContract() {
System.out.println("Writing the contract and signing...");
}
// 具体实现方法
public void issueCard() {
System.out.println("Issuing the bank card...");
}
// 抽象方法
public abstract void fillApplication();
}
接下来,我们定义不同种类的银行账号,如储蓄账户和信用卡账户,在继承抽象类Account
的基础上实现其中的抽象方法(填写申请表fillApplication()
)。
储蓄账户SavingAccount
:
public class SavingAccount extends Account {
// 实现抽象方法
public void fillApplication() {
System.out.println("Filling the application for saving account...");
}
}
信用卡账户CreditAccount
:
public class CreditAccount extends Account {
// 实现抽象方法
public void fillApplication() {
System.out.println("Filling the application for credit account...");
}
}
最后,测试类TemplateMethodDemo
,创建具体实例,调用其模板方法openAccount()
即可。
public class TemplateMethodDemo {
public static void main(String[] args) {
Account savingAccount = new SavingAccount();
System.out.println("Opening a saving account...");
savingAccount.openAccount();
Account creditAccount = new CreditAccount();
System.out.println("Opening a credit account...");
creditAccount.openAccount();
}
}
输出结果:
Opening a saving account...
Filling the application for saving account...
Checking the application...
Approving the application...
Writing the contract and signing...
Issuing the bank card...
Opening a credit account...
Filling the application for credit account...
Checking the application...
Approving the application...
Writing the contract and signing...
Issuing the bank card...
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java设计模式之浅谈模板方法模式 - Python技术站