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!
    
  • 相关阅读:
    Linux Core Dump【转】
    定位多线程内存越界问题实践总结【转】
    gcc __attribute__关键字举例之visibility【转】
    va_start(),va_end()函数应用【转】
    谁在call我-backtrace的实现原理【转】
    利用backtrace和ucontex定位segment错误【转】
    善用backtrace解决大问题【转】
    linux backtrace()详细使用说明,分析Segmentation fault【转】
    利用gcc自带的功能-fstack-protector检测栈溢出及其实现【转】
    Linux环境下段错误的产生原因及调试方法小结【转】
  • 原文地址:https://www.cnblogs.com/feiqiangsheng/p/12219912.html
Copyright © 2011-2022 走看看