设计模式 - 模版模式

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_15071263/article/details/102594581

设计模式 - 模版模式


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

猜你喜欢

转载自blog.csdn.net/qq_15071263/article/details/102594581