模版方式模式
模版模式就是把一次性实现一个不同的逻辑(算法),并将可变的行为留给子类来实现
各子类公共的部分的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。
模版方法模式的父类,一定要用抽象类,因为我们模式方法模式最主要的是让我们相同的代码逻辑只编写一次,不同的逻辑让子类完成,当然在JDK1.8中我们的接口也可以有自己的模式的实现方法。我们也可以用1.8的接口来实现。
比如我们在生活中,每个人从早到晚都有相同的步骤,也有不同的步骤,例如,我们每个人早上起床要穿衣,刷牙,洗脸,吃早餐,然后每个人吃完早餐后又有不同的事情要做,然后又要到吃午餐,吃完午餐后又有不同的事情要做,比如有些要睡午觉,然后有些要玩会游戏,接下来又要吃晚餐,晚餐后又有不同的事情要做,最后就是我们就要洗漱、然后休息。
每个人重复的动作有:吃起床穿衣、刷牙、洗脸、吃早餐、吃午餐、吃晚餐、洗漱、休息
不同的行为有:吃完早餐后的时间、吃完午餐后的时间、吃完晚餐后的时间
这里我们需要每个人相同的动作抽离出来,让每个人都具有这些行为,然后每个人的不同的行为让每个人自己去实现完成。
具体流程为下:
1、起床穿衣
2、洗脸刷牙
3、吃早餐
4、做不同的事(每个人不同)
5、吃午餐
6、做不同的事(每个人不同)
7、吃晚餐
8、做不同的事(每个人不同)
9、洗漱
10、休息
talk is cheap show me the code
新建一个我们人的总父类,这个父类定义了一个生活的方法(live()),在这个方法里面对我们每个人的生活步骤进行绑定,我们给这个方法加inal修饰让我们的子类(各个不同的人)不允许重写这个方法随意改变我们的生活步骤,然后在这个方法中,我们把每个人相同的生活步骤方法逻辑写进来,定义我们每个人不同的生活步骤的抽象接口,让我们每个人自己去重写这些方法,最后我们通过live()方法把每个人的生活步骤打印出来。
/**
* @description: 人的抽象类,用于定义每个人相同的行为
* 我们这里定义一个抽象类,因为抽象类即可以有接口让子类去实现,也可以有自己的方法实现
* @author: Jh Lee
* @create: 2019-03-17 14:57
**/
public abstract class Person {
//1、起床穿衣
//2、洗脸刷牙
//3、吃早餐
//4、做不同的事(每个人不同)
//5、吃午餐
//6、做不同的事(每个人不同)
//7、吃晚餐
//8、做不同的事(每个人不同)
//9、洗漱
//10、休息
//我们在这里直接对每个人的生活步骤进行锁定,加final修饰让我们每个人实现这个接口时不能实现这个方法
//下面每个人相同生活步骤都是加了final修饰,不能让实现这个父类的子类来进行方法重写
protected final void live(){
//第一步
getUpTakeClothing();
//第二步
wash();
//第三步
eatBreakfast();
//第四步 做不同的是,让子类实现这个方法自己编写逻辑
doingFour();
//第五步
eatLunch();
//第六步
doingSix();
//第七步
eatSupper();
//第八步
doingEight();
//第九步
takeBatch();
//最后一步
sleep();
}
//起床穿衣
final void getUpTakeClothing(){
System.out.println("今天真是美好的一天,穿衣服起床!");
}
//洗脸刷牙
final void wash(){
System.out.println("我洗好脸,刷好牙啦,准备吃早餐!");
}
//吃早餐
final void eatBreakfast(){
System.out.println("吃完早餐啦,早餐真好吃!");
}
//定义第四步的接口,让子类实现
protected abstract void doingFour();
//吃午餐
final void eatLunch(){
System.out.println("中午好饿啊,我要开始吃午餐啦!");
}
//定义第六步的接口,让子类实现
protected abstract void doingSix();
//吃晚餐
final void eatSupper(){
System.out.println("过了一天了,吃顿丰富的晚餐弥补一下自己!");
}
//定义第八步的接口,让子类实现
protected abstract void doingEight();
//洗澡洗漱
final void takeBatch(){
System.out.println("今天出了好多汗,洗个澡准备睡觉了!");
}
//休息
final void sleep(){
System.out.println("好困,我要睡觉了~~~~");
}
}
这个类主要对我们每个人生活的逻辑进行绑定,这就是一个模版,我们每个人都是通过这个模版来进行我们生活步骤的。
接下来我们定义一个A的人,他会根据他自己的生活习惯重写我们第四步,第六步,第八步
/**
* @description: 一个代表A的人
* @author: Jh Lee
* @create: 2019-03-17 15:23
**/
public class PersonA extends Person {
//重写第四布,自己编写逻辑
@Override
protected void doingFour() {
System.out.println("---吃完早餐啦,我要去公园玩一会儿---");
}
//重写第六步,自己编写逻辑
@Override
protected void doingSix() {
System.out.println("---吃完午餐啦,我想打会游戏---");
}
//重写第八步,自己编写逻辑
@Override
protected void doingEight() {
System.out.println("---吃完晚餐啦,看会电影放松一下自己---");
}
}
我们又有一个B的人,他的生活习惯又不同
/**
* @description: 代表一个叫B的人
* @author: Jh Lee
* @create: 2019-03-17 15:28
**/
public class PersonB extends Person {
//重写第四布,自己编写逻辑
@Override
protected void doingFour() {
System.out.println("---吃完早餐啦,我要学习一会---");
}
//重写第六步,自己编写逻辑
@Override
protected void doingSix() {
System.out.println("---吃完午餐啦,我要午休一会起来再学习一会---");
}
//重写第八步,自己编写逻辑
@Override
protected void doingEight() {
System.out.println("---吃完晚安啦,我要出去运动一下消化一下---");
}
}
到这里我们整个通过模版方法模式设计我们每个人的生活步骤的代理已经编写完毕了,我们测试一下看看会有怎么样的效果
/**
* @description: 模版方法模式测试类
* @author: Jh Lee
* @create: 2019-03-17 15:25
**/
public class TemplateMethodTest {
public static void main(String[] args) {
Person personA = new PersonA();
personA.live();
System.out.println("-------------------------------------------------------");
Person personB = new PersonB();
personB.live();
}
}
可以看到我们通过实力话一个PersonA和一个PersonB,让他们都打印出自己的生活步骤
结果:
我们看到,A和B的第四步、第六步、第八步,都是根据自己所编写的那样所实现了自己对应的生活步骤,这就是我们通过模版模式来完成我们每个人的一些生活,相同的生活步骤我们通过父类直接编写,避免了每个人都会重复编写同样的代码逻辑,而根据不同的生活步骤让子类自己来实现其中的逻辑,这个就是我们的模版方法模式。