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.
  • 相关阅读:
    ADF中遍历VO中的行数据(Iterator)
    程序中实现两个DataTable的Left Join效果(修改了,网上第二个DataTable为空,所处的异常)
    ArcGIS api for javascript——鼠标悬停时显示信息窗口
    ArcGIS api for javascript——查询,然后单击显示信息窗口
    ArcGIS api for javascript——查询,立刻打开信息窗口
    ArcGIS api for javascript——显示多个查询结果
    ArcGIS api for javascript——用图表显示查询结果
    ArcGIS api for javascript——查询没有地图的数据
    ArcGIS api for javascript——用第二个服务的范围设置地图范围
    ArcGIS api for javascript——显示地图属性
  • 原文地址:https://www.cnblogs.com/baishouzu/p/12306071.html
Copyright © 2011-2022 走看看