模板方法模式(解决一类问题完整逻辑)
看到模板,可能会想到解决问题的一套模板,一个套路,通用的手法,具体的场景里面某个细节点不一样。把很多的方法有逻辑性(有先后顺序)的组织在一起就称之为模板方法模式,里面的抽象方法,必须依靠具体的场景(子类)实现。
在生活中,比如有的男生做饭,有的女生做饭,做饭是有一个套路,先买菜,切菜,再煮饭,然后再吃饭。但是有一个地方不一样,某某喜欢吃辣的,就多放些辣椒,某某喜欢吃咸的,就多放点咸盐。区别就是某个细节点不一样。所以放调料的时候是抽象方法。
在spring中 AbstractFactoryBean 抽象factoryBean对象创建,部分功能留给子类去实现。
遵循了设计模式6大原则中的里氏替换原则,父类出现的地方,子类一定可以出现。
1、首先玩游戏的套路都一样:所以抽象出类
package com.weizhaoyang.template;
/**
* 游戏模板
*/
public abstract classGame{
abstract void intialize();
abstract void startPlay();
abstract void endPlay();
//玩游戏方法
public final void play(){
//初始化游戏
intialize();
//开始游戏
startPlay();
//结束游戏
endPlay();
}
}
2、提供一个足球的游戏
package com.weizhaoyang.template;
publicclassFootballGame extends Game{
@Override
void intialize() {
System.out.println("游戏初始化");
}
@Override
void startPlay() {
System.out.println("游戏开始,用脚踢球");
}
@Override
void endPlay() {
System.out.println("游戏结束");
}
}
3、提供 一个篮球的游戏
package com.weizhaoyang.template;
publicclassBasketBallGame extends Game{
@Override
void intialize() {
System.out.println("游戏初始化");
}
@Override
void startPlay() {
System.out.println("游戏开始,用手拍球");
}
@Override
void endPlay() {
System.out.println("游戏结束");
}
}
4、提供一个测试类:
package com.weizhaoyang.template;
/**
* 测试类
*/
publicclassGameTest{
publicstaticvoid main(String[] args) {
//进行测试
Game game=newFootballGame();
game.play();
}
}
运行的结果如下:
在上面的FootBallGame或者BasketBallGame这两个类也可以在做一个抽象类,把startPlay方法做为抽象方法,因为可以用力,或者轻力去操作球,所以在框架中有很多抽象类继承抽象类,它就是这种思想,抽象是无场景化的。在上面的例子中,抽象类中有一套的逻辑,而接口是没有的,必须保证所有方法实现。上面的例子football和basketBall还没有具体到某个人。
在框架中用的最多的就是模板方法模式。