• <读书笔记> Thinking in python (Python 设计模式) 2. Templated Method


    1. templated method in python
    书中第三章介绍templated method 模版方法,
    其核心思想是基类提供相同的运算框架,子类在相同框架基础上提供不同的实现。
    python 实例如下:
     1 #: c03:TemplateMethod.py
     2 # Simple demonstration of Template Method.
     3 
     4 class ApplicationFramework:
     5   def __init__(self):
     6     self.__templateMethod()
     7   def __templateMethod(self):
     8     for i in range(5):
     9       self.customize1()
    10       self.customize2()
    11 
    12 # Create a "application":
    13 class MyApp(ApplicationFramework):
    14   def customize1(self):
    15     print "Nudge, nudge, wink, wink! ",
    16   def customize2(self): 
    17     print "Say no more, Say no more!"
    18 
    19 # Create another "application":
    20 class MyApp2(ApplicationFramework):
    21   def customize1(self):
    22     print "Basketball, basketball ",
    23   def customize2(self): 
    24     print "Once more, Once more!"
    25 MyApp()
    26 MyApp2()
    27 #<hr>
    28 output = '''
    29 Nudge, nudge, wink, wink!  Say no more, Say no more!
    30 Nudge, nudge, wink, wink!  Say no more, Say no more!
    31 Nudge, nudge, wink, wink!  Say no more, Say no more!
    32 Nudge, nudge, wink, wink!  Say no more, Say no more!
    33 Nudge, nudge, wink, wink!  Say no more, Say no more!
    34 Basketball, basketball  Once more, Once more!
    35 Basketball, basketball  Once more, Once more!
    36 Basketball, basketball  Once more, Once more!
    37 Basketball, basketball  Once more, Once more!
    38 Basketball, basketball  Once more, Once more! 
    39 '''
    该方法的思想是基类提供一个框架模版,基类在构造函数中完成必要的初始化和启动引擎(templated mehtod),而用户,子类,只需要提供
    customize1和customize2的具体实现即可。
    2.templated method in c++
    下面利用虚函数给出基本等价的c++实现,即customize1,customize2在基类中被定义程纯虚函数,
    派生类负责提供具体实现,但在基类中可以调用customize1,同时c++的虚函数表机制保证了,在基类
    中可以调用适当的派生类的实现(例如MyApp的对象会调用MyApp实现的customize1)
    但是注意没有完全和上述python程序等价的c++实现,因为我们不能在构造函数中启动templated method,这是因为
    基类的构造函数在构造的时候派生类对于C++编译器而言可以认为是还不存在的,在base class构造期间,virtual 函数
    不是virtual函数,具体参见effective c++ 第三版的条款09 绝不在构造和析构过程中调用virtual 函数.
    例如下面的C++代码,如果在构造函数中调用templateMethod()调则在运行时会出错显示试图调用pur virtual function,
    即调用基类的customize1而基类的customize1仅仅是接口没有提供实现,所以会异常,退出。
     1 #include <iostream>
     2 using namespace std;
     3 
     4 class ApplicationFramework {
     5 public:
     6     ApplicationFramework() {
     7         //templateMethod();
     8     }
     9     void start() {
    10         templateMethod();
    11     }
    12     virtual void customize1() = 0;
    13     virtual void customize2() = 0;
    14     virtual void customize3() {
    15         cout << "base" << endl;
    16     }
    17 private:
    18     void templateMethod() {
    19         for (int i = 0; i < 5; i++) {
    20             customize1();
    21             customize2();
    22             customize3();
    23         }
    24     }
    25 };
    26 
    27 class MyApp: public ApplicationFramework {
    28 public:
    29     void customize1() {
    30         cout << "Nudge, nudge, wink, wink! "
    31     }
    32     void customize2() {
    33         cout << "Say no more, Say no more!" << endl;
    34     }
    35     void customize3() {
    36         cout << "my app" << endl;
    37     }
    38 };
    39 
    40 class MyApp2: public ApplicationFramework {
    41 public:
    42     void customize1() {
    43         cout << "Basketball, basketball "
    44     }
    45     void customize2() {
    46         cout << "Once more, Once more!" << endl;
    47     }
    48 };
    49 
    50 int main(int argc, char *argv[])
    51 {
    52     MyApp my_app = MyApp();
    53     my_app.start();
    54     MyApp2 my_app2 = MyApp2();
    55     my_app2.start();
    56     return 0;
    57 }
    58 
    59 /* output:
    60 Nudge, nudge, wink, wink! Say no more, Say no more!
    61 my app
    62 Nudge, nudge, wink, wink! Say no more, Say no more!
    63 my app
    64 Nudge, nudge, wink, wink! Say no more, Say no more!
    65 my app
    66 Nudge, nudge, wink, wink! Say no more, Say no more!
    67 my app
    68 Nudge, nudge, wink, wink! Say no more, Say no more!
    69 my app
    70 Basketball, basketball Once more, Once more!
    71 base
    72 Basketball, basketball Once more, Once more!
    73 base
    74 Basketball, basketball Once more, Once more!
    75 base
    76 Basketball, basketball Once more, Once more!
    77 base
    78 Basketball, basketball Once more, Once more!
    79 base
    80 */

    综上,也证明了不考虑效率的化,显然python代码更优,因为你可以集中精力在问题上,而不用处处小心C++的陷阱,(如,my god 我又忽略了effective c++的条款...:))
  • 相关阅读:
    JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别
    Transact-SQL 示例
    Transact-SQL 示例
    JQuery Easyui引入easyui-lang-zh_CN.js后出现乱码的问题解决方法
    easyui 表格底部加合计
    VS调试技巧之附加进程
    c#如何读取相机手机的拍摄时间
    调用 webapi的put和delete 报"Method Not Allowed" 405 错误。
    sqlserver数据库 去除字段中空格,换行符,回车符(使用replace语句)
    C#中yield return用法分析
  • 原文地址:https://www.cnblogs.com/rocketfan/p/1575108.html
Copyright © 2020-2023  润新知