zoukankan      html  css  js  c++  java
  • Item 22. 模板方法与曲线救国(Template Method)

    Item 22. Template Method

    敬告
    Template Method 与 C++中的templates毫不相干,它只是一种设计方法(亦或设计模式)。
    ------------------------
    1、Template Method设计的目的
    Template Method是用于基类设计的一种方法,它使得子类的任务更加清晰,让子类设计者的注意力集中于基类的contract是如何实现的,而不必关心各个contract之间的关系。对于基类来说就是“曲线救国”。

    2、从继承角度看成员函数
    虚函数,纯虚函数,非虚函数
    对虚函数函数,子类设计者有权利选择是否Overriding它。因此基类设计者就需要对它有一个默认的实现。
    对纯虚函数,子类就必须要Overriding它。
    而非虚函数,子类可以写一个与基类有的一样的非虚函数(not called Overriding),但子类里的这个函数又不能用于多态机制,所以还是不要写它。

    3、从访问权利看成员函数
    private,public,protected
    ……

    4、Template Method 的实现
    Template Method 就是依靠2、3两点来实现的。
    基类用一个public nonvirtual 成员函数访问protected virtual成员函数,
    子类在需要的时候可以选择Overriding那个protected virtual成员函数,如果是个
    pure protected virtual成员函数,那就必须Overriding它。

    class App {
      public:
        virtual ~App();
        //...
        void startup() { // Template Method
            initialize();
            if( !validate() )
                altInit();
        }
      protected:
        virtual bool validate() const = 0;
        virtual void altInit();
        //...
      private:
        void initialize();
        //...
    };

    class MyApp : public App {
      public:
        //...
      private:
        bool validate() const;
        void altInit();
        //...
    };

    5、为什么要用Template Method?
    Template Method使得基类控制了函数的调用顺序(执行流程),子类只负责某个步骤的实现(具体要看是虚还是纯虚)。这样在子类不知道执行细节的情况下,整个系统就动起来了。确实很妙!MFC就是这样的。
    所以就不要奇怪当年有人选择“曲线救国”那条路了

  • 相关阅读:
    实战MEF(4):搜索范围
    实战MEF(3):只导出类的成员
    Mac 配置 php-fpm 时出现'/private/etc/php-fpm.conf': No such file or directory (2)
    如何实现在H5里调起高德地图APP?
    PHPExcel 基本用法详解
    最简单的css实现页面宽度自适应
    去掉IntelliJ IDEA 中 mybatis 对应的 xml 文件警告
    SQLyog恢复数据库报错解决方法【Error Code: 2006
    解决svn log显示no author,no date的方法之一
    Centos 7(Linux)环境下安装PHP(编译添加)相应动态扩展模块so(以openssl.so为例)
  • 原文地址:https://www.cnblogs.com/aiwz/p/6333236.html
Copyright © 2011-2022 走看看