zoukankan      html  css  js  c++  java
  • 模板模式

    模式介绍

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

    模式优点

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

    模式缺点

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

    使用场景

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

    系统建模

    1、创建一个游戏的抽象类Game,里面定义了模板方法play。
    2、子类Football、Cricket实现了各个方法,钩子方法按需实现。
    3、钩子方法默认是空方法。

    系统实现

    /**
     * 游戏抽象类,其中play为模板方法
     */
    public abstract class Game {
       abstract void initializeGame();
       abstract void startGame();
       abstract void endGame();
       // 钩子方法,子类看情况来决定是否覆盖
       public void otherOperation(){}
    
       public final void play(){
          initializeGame();
          startGame();
          endGame();
          otherOperation();
       }
    }
    
    /**
     * 足球类
     */
    public class Football extends Game {
    
       @Override
       void endGame() {
          System.out.println("Football Game Finished!");
       }
    
       @Override
       void initializeGame() {
          System.out.println("Football Game Initialized! Start playing.");
       }
    
       @Override
       void startGame() {
          System.out.println("Football Game Started. Enjoy the game!");
       }
    }
    
    /**
     * 板球类
     */
    public class Cricket extends Game {
    
       @Override
       void endGame() {
          System.out.println("Cricket Game Finished!");
       }
    
       @Override
       void initializeGame() {
          System.out.println("Cricket Game Initialized! Start playing.");
       }
    
       @Override
       void startGame() {
          System.out.println("Cricket Game Started. Enjoy the game!");
       }
    
       @Override
       public void otherOperation() {
        System.out.println("see you next time!");
       }
    }
    
    /*
     * 客户端
     */
    public class Client {
        public static void main(String[] args) {       
            Game game = new Cricket();
            game.play();
            System.out.println("***************************************************");
            game = new Football();
            game.play();      
         }
    }
    结果:
    Cricket Game Initialized! Start playing.
    Cricket Game Started. Enjoy the game!
    Cricket Game Finished!
    see you next time!
    ***************************************************
    Football Game Initialized! Start playing.
    Football Game Started. Enjoy the game!
    Football Game Finished!
    
  • 相关阅读:
    安装Windows 和 Linux双系统(vmware) Centos7
    Nginx
    rsync详细配置
    19、Squid代理服务器
    5、SAMBA服务二:配置实例
    5、SAMBA服务一:参数详解
    4、NFS
    1、网络基本配置
    Spring data mongodb使用
    win下MongoDB使用
  • 原文地址:https://www.cnblogs.com/feiqiangsheng/p/12219912.html
Copyright © 2011-2022 走看看