zoukankan      html  css  js  c++  java
  • 设计模式---模板方法模式

      曾经第一次学习设计模式的时候,总觉得这玩意没有用。这段时间重新看视频学习,才领略到设计模式的好处。今天我想说说模板方法模式。

      模板想必大家在生活中是经常用的。比如说写简历可以套一个简历模板,写一个网页可以套一个前端模板。当你使用一个模板的时候,你会根据自己的需求去修改模板的一部分内容。对于模板方法的使用和设计,与现实中的模板是基本一致的。这也是为什么它叫这个名字。

      接下来我们考虑一个场景:用程序实现一个人一天的活动流程,包括吃早饭,吃午饭,打篮球,吃晚饭,跑步。这里限定吃饭的函数总是不变的

      一开始你可能会写出如下代码,这是很自然的想法。

    class Eat {
    public:
      void EatBreakFast() {}
      void EatLunch() {}
      void EatDinner() {}
    };
    class DoSport {
    public:
      void PlayBasketBall() {}
      void Running() {}
    };

    int main()
    {
      Eat e;
      DoSport ds;
      e.EatBreakFast();
      e.EatLunch();
      ds.PlayBasketBall();
      e.EatDinner();
      ds.Running();
    }

       那么如果用模板方法模式来写呢?代码如下:

    // DayInLife是一个模板
    class DayInLife {
    public:
      void OneDay() {
        EatBreakFast();
        EatLunch();
        PlayBasketBall();
        EatDinner();
        Running();
      }
      virtual void PlayBasketBall() = 0;
      virtual void Running() = 0;
    private:
      void EatBreakFast() {
      
      }
      void EatLunch() {

      }
      void EatDinner() {
      
      }
    };

    class MyDay : public DayInLife {
    public:
      // 实现两个virtual 函数
      void PlayBasketBall() {
      
      }
      void Running() {

      }
    }

    int main()
    {
      DayInLife* my = new MyDay();
      my->OneDay();
      return 0;
    }

      那么问题来了,使用模板方法到底有什么好处呢?

      假设这个关于活动流程的类都是别人开发的,而你要使用这些类来实现你自己的功能。如果这些类是以第一种方式设计的,那么你每次写关于某个人一天的流程你都要把吃饭的动作给写上,比如说

    // 第一个人的一天
      Eat e;
      DoSport ds;
      e.EatBreakFast();
      e.EatLunch();
      ds.PlayBasketBall();
      e.EatDinner();
      ds.Running();

    // 第二个人的一天, 因为每个人打篮球和跑步的方式不同所以你又设计了一个DoSport类
      DoSport2 ds2;
      e.EatBreakFast();
      e.EatLunch();
      ds2.PlayBasketBall();
      e.EatDinner();
      ds2.Running();

      你知道对于每个人,他们的吃饭动作或者说函数都是一样的(场景设定的),你可能会自己封装一个函数

    void OneDayInLife(DoSport* doSport) {
      Eat e;
      e.EatBreakFast();
      e.EatLunch();
      doSport->PlayBasketBall();
      e.EatDinner();
      doSport->Running();
    }

      但不管哪种方式,这些流程你都要来写一遍。然而这些流程是固定的,其中唯一有变化的地方只是人们运动的方式不一样,那么更好的想法是这些类的开发者把这些固定的动作封装起来,而把变化的部分暴露给使用者,让使用者根据自己的需求来自定义动作。这样子main中的代码也变得简洁了很多!

      总的来说,如果这些类都是给自己使用的话,完全可以不用模板模式。然而考虑给别人用的话,那么使用者就会获得很大的便利。这就是设计模式的好处,方便类的使用者来开发程序!

  • 相关阅读:
    python3.8安装flask出现错误“ModuleNotFoundError: No module named '_ctypes'”
    利用virtualenvwrapper创建虚拟环境出现错误“/usr/bin/python: No module named virtualenvwrapper”
    CentOS7 下升级Python版本
    Python 定义动态变量
    Linux常用命令
    项目经验之:项目用到LinQ (总结)
    ListBox操作一些总结
    项目经验之:如CSDN一样的分页,我能否做这样的分页吗??????
    记上一笔,listbox展示项中,隐藏其中一项
    项目经验之:SQL一些简单问题中可以使用的技巧
  • 原文地址:https://www.cnblogs.com/David-Lin/p/10787902.html
Copyright © 2011-2022 走看看