zoukankan      html  css  js  c++  java
  • 模板模式(Template Pattern)

    模板模式(Template Pattern)

    一个抽象类(模板)定义了类中方法的执行方式,子类对模板中的方法进行具体实现,调用的时候以抽象类中的方式进行调用。
    目的:定义一个类中方法的骨架,将特定实现延续到子类中。
    主要解决:一些方法通用,却在每一个子类中都重写了这个方法。
    何时使用:一些通用的方法。
    如何解决:将这些通用算法抽象在模板中。
    关键代码:在抽象类中实现,其他步骤在子类中实现。
    使用场景:多个子类有共同的方法,且逻辑相同;重复复杂的方法。
    优点:封装不需要改变的部分,扩展可以改变的部分;提取公共代码,便于维护;行为由父类控制,(具体)类容由子类实现。
    缺点:每一个不同的子类实现都需要写一个模板的子类,子类个数增加,系统庞大。
    注意事项:防止恶意操作,模板方法一般都加final关键字。

    创建抽象类(模板)

     1 /**
     2  * @author: wooch
     3  * @create: 2020/02/14
     4  */
     5 public abstract class Game {
     6     abstract void initialize();
     7     abstract void startPlay();
     8     abstract void endPlay();
     9     // 模板
    10     public final void play(){
    11         // 初始化
    12         initialize();
    13         // 开始
    14         startPlay();
    15         // 结束
    16         endPlay();
    17     }
    18 }

    创建子类(Cricket)

     1 /**
     2  * @author: wooch
     3  * @create: 2020/02/14
     4  */
     5 public class Cricket extends Game {
     6     @Override
     7     void initialize() {
     8         System.out.println("Cricket Game Initialized!");
     9     }
    10 
    11     @Override
    12     void startPlay() {
    13         System.out.println("Cricket Game Started.");
    14     }
    15 
    16     @Override
    17     void endPlay() {
    18         System.out.println("Cricket Game Finished.");
    19     }
    20 }

    创建子类(Football)

     1 /**
     2  * @author: wooch
     3  * @create: 2020/02/14
     4  */
     5 public class Football extends Game {
     6     @Override
     7     void initialize() {
     8         System.out.println("Football Game Initialized!");
     9     }
    10 
    11     @Override
    12     void startPlay() {
    13         System.out.println("Football Game Started.");
    14     }
    15 
    16     @Override
    17     void endPlay() {
    18         System.out.println("Football Game Finished.");
    19     }
    20 }

    演示结果

     1 /**
     2  * @author: wooch
     3  * @create: 2020/02/14
     4  */
     5 public class TemplatePatternTest {
     6     public static void main(String[] args) {
     7         Game game = new Cricket();
     8         game.play();
     9         System.out.println();
    10         game = new Football();
    11         game.play();
    12     }
    13 }

    运行结果

    1 Cricket Game Initialized!
    2 Cricket Game Started.
    3 Cricket Game Finished.
    4 
    5 Football Game Initialized!
    6 Football Game Started.
    7 Football Game Finished.
  • 相关阅读:
    hash_map和map的区别
    STL中map与hash_map容器的选择收藏
    ServletContextListener和ContextLoaderListener的区别
    解决Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile
    详解Tomcat线程池原理及参数释义
    Tomcat使用线程池配置高并发连接
    详解 Tomcat 的连接数与线程池
    ServletContextListener接口用法
    Spring Quartz定时任务如何获得ServletContext对象?
    如何在spring quartz类中拿到ServletContext
  • 原文地址:https://www.cnblogs.com/baishouzu/p/12306071.html
Copyright © 2011-2022 走看看