1、模板方法介绍
模板方法模式是在一个方法中定义一个算法的骨架,将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板方法可以进行挂钩(hook),钩子(hook)是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在,可以让子类有能力对算法的不同点进行挂钩。
2、代码实现
/**
* 4S店提供售卖模板
* @author Administrator
*
*/
public abstract class SaleCarTemplate
{
public void processBuy(){
carLoan();
carInsurance();
carDecoration();
if(carLicenseBy4S()){
System.out.println("通过4S店办理上牌");
} else {
carLicense();
}
}
public void carLoan(){
System.out.println("在4S店办理汽车贷款,一般强制");
}
public void carInsurance(){
System.out.println("在4S店办理汽车保险,一般强制");
}
/**
* 默认通过4S店办理上牌,如果想自己上牌,就主动提出
*/
public abstract void carLicense();
/**
* 为吸引消费者,4S店会赠送一些汽车装饰,消费者自己选择需要什么装饰
*/
public abstract void carDecoration();
public boolean carLicenseBy4S(){
// 钩子
return true;
}
}
/**
* 消费者在模板基础上自定义购买套餐
* @author Administrator
*
*/
public class CustomerBuy extends SaleCarTemplate
{
public void carLicense(){
System.out.println("不通过4S店上牌,自己上牌");
}
public boolean carLicenseBy4S(){
String userInput = "";
boolean isAgreed = false;
BufferedReader bufferReader = new BufferedReader(new InputStreamReader(System.in));
try
{
System.out.println("你想通过4S店办理上牌吗,回答y/n");
userInput = bufferReader.readLine();
}
catch (IOException e)
{
e.printStackTrace();
} finally {
try
{
bufferReader.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
if(userInput.equals("y")){
isAgreed = true;
} else {
isAgreed = false;
}
return isAgreed;
}
@Override
public void carDecoration()
{
System.out.println("赠送行车记录仪");
System.out.println("赠送贴膜");
}
}
public static void main(String[] args)
{
System.out.println("开始汽车购买流程--------");
CustomerBuy customerBuy = new CustomerBuy();
customerBuy.processBuy();
}
结果输出
开始汽车购买流程--------
在4S店办理汽车贷款,一般强制
在4S店办理汽车保险,一般强制
赠送行车记录仪
赠送贴膜
你想通过4S店办理上牌吗,回答y/n
n
不通过4S店上牌,自己上牌