版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
设计模式 - 模版模式
1、简述
模板模式属于行为型模式
一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行
主要解决:一些方法通用,却在每一个子类都重新写了这一方法
为防止恶意操作,一般模板方法都加上 final 关键词
2、创建模版
本实例使用java 8 的函数式方法编写模版
import java.util.function.Consumer;
/** @author Created by 谭健 on 2019/10/9. 星期三. 9:44. © All Rights Reserved. */
public abstract class GameTemplate {
public abstract void init();
public abstract void loadSource();
public abstract void connect();
public final void start() {
Consumer<GameTemplate> init = GameTemplate::init;
Consumer<GameTemplate> consumer =
init.andThen(GameTemplate::loadSource).andThen(GameTemplate::connect);
consumer.accept(this);
}
}
3、创建模版实现
import lombok.extern.slf4j.Slf4j;
/** @author Created by 谭健 on 2019/10/9. 星期三. 9:52. © All Rights Reserved. */
@Slf4j
public class GameA extends GameTemplate {
@Override
public void init() {
log.info("GameA:{}", "init");
}
@Override
public void loadSource() {
log.info("GameA:{}", "loadSource");
}
@Override
public void connect() {
log.info("GameA:{}", "connect");
}
}
import lombok.extern.slf4j.Slf4j;
/** @author Created by 谭健 on 2019/10/9. 星期三. 9:54. © All Rights Reserved. */
@Slf4j
public class GameB extends GameTemplate {
@Override
public void init() {
log.info("GameB:{}", "init");
}
@Override
public void loadSource() {
log.info("GameB:{}", "loadSource");
}
@Override
public void connect() {
log.info("GameB:{}", "connect");
}
}
4、使用模版运行
/** @author Created by 谭健 on 2019/10/9. 星期三. 9:54. © All Rights Reserved. */
public class Main {
public static void main(String[] args) {
GameTemplate game = new GameA();
game.start();
game = new GameB();
game.start();
}
}
输出
16:28:14.496 [main] INFO com.wretchant.designpatterns.behavioral.template.GameA - GameA:init
16:28:14.499 [main] INFO com.wretchant.designpatterns.behavioral.template.GameA - GameA:loadSource
16:28:14.500 [main] INFO com.wretchant.designpatterns.behavioral.template.GameA - GameA:connect
16:28:14.500 [main] INFO com.wretchant.designpatterns.behavioral.template.GameB - GameB:init
16:28:14.500 [main] INFO com.wretchant.designpatterns.behavioral.template.GameB - GameB:loadSource
16:28:14.500 [main] INFO com.wretchant.designpatterns.behavioral.template.GameB - GameB:connect