模板方法模式的基本概念
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
意思是,某些固定的代码写在模板中,并封装一些子类不同实现的方法给子类去实现,而子类继承了这个模板的固定方法,并以自己的形式对其余的方法进行重写。
什么时候用模板方法模式
当某些代码的大部分是不变的,而又一小部分需要经常进行变动,这时候就可以使用模板方法模式,将不变的代码作为一个模板,把经常需要改动的部分交给子类来实现。
这样做的结果自然使代码结构更加清晰,而且更易于看懂维护。
模板方法模式怎么用
比方说每个人一天的吃饭
早餐吃馒头
午餐吃面条
晚餐吃粉丝
每个人都是固定的有早餐午餐晚餐,而变动的只是吃什么。
所以我们可以创建这样的一个模板类:
/**
* @author : cjd
* @Description : 模板方法模式
* @create : 2018-02-27 11:20
**/
public abstract class AbstractEatting {
public void eat(){
System.out.println("早餐:"+morningEat());
System.out.println("午餐:"+noonEat());
System.out.println("晚餐:"+eveningEat());
}
public abstract String morningEat();
public abstract String noonEat();
public abstract String eveningEat();
}
当子类继承了该模板后,只需要对3个抽象方法进行重写即可。
/**
* @author : cjd
* @Description : 模板方法实现类
* @create : 2018-02-27 11:25
**/
public class CjdEatting extends AbstractEatting {
@Override
public String morningEat() {
return "鸡蛋";
}
@Override
public String noonEat() {
return "面条";
}
@Override
public String eveningEat() {
return "馄饨";
}
}
主函数进行如下调用即可:
public class Main {
public static void main(String[] args) {
new CjdEatting().eat();
}
}
早餐:鸡蛋
午餐:面条
晚餐:馄饨
A方法是具体的实现逻辑
B/C/D方法交给子类来实现
这就是模板方法模式了
后记
当我们在某一个地方的实现有不同的细微的差别时,模板方法可以将这种细微交由子类去完成。也因不合理的继承会导致代码的混乱,因而使用模板方法来对这些不合理进行一定程度的限制。