<读书笔记> 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++的条款...:))

你可能感兴趣的:(template)