模板方法顾名思义将一些成型的、固定的定义为模板。
下面我们来设想一个创景:人需要洗漱、吃饭、睡觉,我们可以把这些流程定义为一个模板;但是pate喜欢用肥皂洗脸,lili喜欢用洗面奶洗脸,这又是每个人不同的洗脸习惯;除此之外,假设angle今天出去跟朋友玩的比较兴奋,她不打算睡觉。
实现:

代码:
/**
* 人行为的模板方法
*/
public abstract class PersonBusiness {
protected void templateMethod(){
wash();
eat();
if (doExcited()){
sleep();
}
}
protected abstract void wash();
protected void eat(){
System.out.println("人需要吃饭");
}
protected void sleep(){
System.out.println("人需要睡觉");
}
/**
* 是否很兴奋
* @return
*/
protected boolean doExcited()
{
return false;
}
}
/**
* 具体某个人的行为-pate
*/
public class Pate extends PersonBusiness{
@Override
protected void wash() {
System.out.println("pate喜欢用肥皂洗脸");
}
}
/**
* 具体某个人的行为-lili
*/
public class Lili extends PersonBusiness {
@Override
protected void wash() {
System.out.println("lili喜欢用洗面奶洗脸");
}
}
/**
* 具体某个人的行为-angel
*/
public class Angel extends PersonBusiness {
@Override
protected void wash() {
System.out.println("angel喜欢用洗面奶洗脸");
}
@Override
protected boolean doExcited(){
return true;
}
}
模板方法模式的结构
模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术。
模板模式的关键是:子类可以置换掉父类的可变部分,但是子类却不可以改变模板方法所代表的顶级逻辑。
模板方法模式中的方法
模板方法中的方法可以分为两大类:模板方法和基本方法。
模板方法
一个模板方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法。
一个抽象类可以有任意多个模板方法,而不限于一个。每一个模板方法都可以调用任意多个具体方法。
对应上面例子中的:com.example.leanspringboot.business.impl.PersonBusiness#templateMethod
基本方法
基本方法又可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。
抽象方法
一个抽象方法由抽象类声明,由具体子类实现。在Java语言里抽象方法以abstract关键字标示。
对应上面例子中的:com.example.leanspringboot.business.impl.PersonBusiness#wash
具体方法
一个具体方法由抽象类声明并实现,而子类并不实现或置换。
对应上面例子中的:com.example.leanspringboot.business.impl.PersonBusiness#eat,com.example.leanspringboot.business.impl.PersonBusiness#sleep
钩子方法
一个钩子方法由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。
需要注意的是,钩子方法默认以do开头
对应上面例子中的:com.example.leanspringboot.business.impl.PersonBusiness#doExcited
网友评论