浅谈设计模式之【模板模式】| Java,ES6语法

【模板模式】
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

【意图】:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
主要解决:一些方法通用,却在每一个子类都重新写了这一方法。
何时使用:有一些通用的方法。
如何解决:将这些通用算法抽象出来。
关键代码:在抽象类实现,其他步骤在子类实现。
应用实例: 1、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。

【优点】: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。

【缺点】:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

【使用场景】: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。

UML

Java

/**
 * 创建一个抽象类,它的模板方法被设置为 final。
 */
public abstract class Game {
   abstract void initialize();
   abstract void startPlay();
   abstract void endPlay();
 
   //模板
   public final void play(){
 
      //初始化游戏
      initialize();
 
      //开始游戏
      startPlay();
 
      //结束游戏
      endPlay();
   }
}

public class Cricket extends Game {
 
   @Override
   void endPlay() {
      System.out.println("Cricket Game Finished!");
   }
 
   @Override
   void initialize() {
      System.out.println("Cricket Game Initialized! Start playing.");
   }
 
   @Override
   void startPlay() {
      System.out.println("Cricket Game Started. Enjoy the game!");
   }
}

public class Football extends Game {
 
   @Override
   void endPlay() {
      System.out.println("Football Game Finished!");
   }
 
   @Override
   void initialize() {
      System.out.println("Football Game Initialized! Start playing.");
   }
 
   @Override
   void startPlay() {
      System.out.println("Football Game Started. Enjoy the game!");
   }
}

/**
 * MAIN
 */
public class TemplatePatternDemo {
   public static void main(String[] args) {
 
      Game game = new Cricket();
      game.play();
      System.out.println();
      game = new Football();
      game.play();      
   }
}
打印结果

ES6

/*
 * 模板模式
 */
class Game {
    constructor() {
        
    }
    init() {}
    start() {}
    end() {}
    play() {
        this.init()
        this.start()
        this.end()
    }
}

class Cricket extends Game {
    init() {
        console.log('Cricket Game Initialized! Start playing')
    }
    start() {
        console.log('Cricket Game Started. Enjoy the game!')
    }
    end() {
        console.log('Cricket Game Finished!')
    }
}

class Football extends Game {
    init() {
        console.log('Football Game Initialized! Start playing')
    }
    start() {
        console.log('Football Game Started. Enjoy the game!')
    }
    end() {
        console.log('Football Game Finished!')
    }
}

{
    let game = new Cricket()
    game.play()
    
    game = new Football()
    game.play()
    
}

打印结果

浅谈设计模式之【观察者模式】| Java,ES6语法
浅谈设计模式之【状态模式】| Java,ES6语法
浅谈设计模式之【中介者模式】| Java,ES6语法

参考文献:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 9,159评论 0 14
  • 参考资料:菜鸟教程之设计模式 设计模式概述 设计模式(Design pattern)代表了最佳的实践,通常被有经验...
    Steven1997阅读 4,925评论 1 12
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 9,382评论 1 15
  • 2017年9月29日上午八点三十分,滦平六中第十届田径运动会隆重开幕。参加开幕式的领导有滦平县教体局韩宝富...
    海云yhy阅读 9,667评论 0 1
  • 所有的经历都是为了能和你在一起,让分别的时光过的快一点,再快一点。 1 2006年,刚入校的艾米第一次遇见凯文。 ...
    小文青年阅读 6,955评论 27 64