c++ 设计模式3 (重构技法 Template Method)

1. 重构

面向对象设计模式是“好的面向对象设计”,所谓“好的面向对象设计”指的是那些可以满足

应对变化,提高复用”的设计。

 

设计模式的要点是“寻找变化点,然后在变化点处应用设计模式,从而更好地理解需求的变化”

“什么时候、什么地点应设计模式”比“理解设计模式结构本身”更为重要。

 

设计模式的应用不宜先入为主,一上来就使用设计模式是对设计模式的最大误用。没有一部到位

的设计模式。敏捷软件开发提倡“Refactoring to Patterns”是目前普遍公认的最好的使用

设计模式的方法。

 

2 重构关键技法

技法与原则比某一个单纯的模式重要。

1) 静态 -> 动态

2)早绑定 -> 晚绑定

3)  继承 -> 组合

4) 编译时依赖 -> 运行时依赖

5) 紧耦合 -> 松耦合

 

3. 组件协作类模式(Template Method, Strategy, Observer)

现在软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,

来实现框架与应用的松耦合,是二者之间协作时常用的模式。

 

3.1 Template Method

动机: 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。

如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化晚期实现需求

 

代码实例:

方法2 相对于 方法1,由程序库开发人员实现程序主流程,留下虚函数step2, step4,供应用程序开发人员晚绑定实现。

如图所示:


 

回到Template Method定义

定义一个操作的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override)该算法的某些特定步骤。

类图关系:

红色稳定,蓝色变化。

要点总结:

    Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的拓展点,是代码复用方面的基本实现结构;

    除了可以灵活应对子步骤的变化外,”不要调用我,让我来调用你“的反向控制结构是Template Method的典型应用;

    在具体实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法,纯虚方法),但一般推荐将它们设置为protected 方法。

 

  1 //程序库开发人员
  2 //template_lib1.cpp
  3 class Library{
  4 
  5 public:
  6     void Step1(){
  7         //...
  8     }
  9 
 10     void Step3(){
 11         //...
 12     }
 13 
 14     void Step5(){
 15         //...
 16     }
 17 };
 18 
 19 //应用程序开发人员
 20 //template_app1.cpp
 21 class Application{
 22 public:
 23     bool Step2(){
 24         //...
 25     }
 26 
 27     void Step4(){
 28         //...
 29     }
 30 };
 31 
 32 int main()
 33 {
 34     Library lib();
 35     Application app();
 36 
 37     lib.Step1();
 38 
 39     if (app.Step2()){
 40         lib.Step3();
 41     }
 42 
 43     for (int i = 0; i < 4; i++){
 44         app.Step4();
 45     }
 46 
 47     lib.Step5();
 48 
 49 }
 50 
 51 //程序库开发人员
 52 //template_lib1.cpp
 53 class Library{
 54 public:
 55     //稳定 template method
    //稳定中有变化,很多设计模式的代码结构
56 void Run(){ 57 58 Step1(); 59 60 if (Step2()) { //支持变化 ==> 虚函数的多态调用 61 Step3(); 62 } 63 64 for (int i = 0; i < 4; i++){ 65 Step4(); //支持变化 ==> 虚函数的多态调用 66 } 67 68 Step5(); 69 70 } 71 virtual ~Library(){ } 72 73 protected: 74 75 void Step1() { //稳定 76 //..... 77 } 78 void Step3() {//稳定 79 //..... 80 } 81 void Step5() { //稳定 82 //..... 83 } 84 85 virtual bool Step2() = 0;//变化 86 virtual void Step4() =0; //变化 87 }; 88 89 //应用程序开发人员 90 //template_app1.cpp 91 class Application : public Library { 92 protected: 93 virtual bool Step2(){ 94 //... 子类重写实现 95 } 96 97 virtual void Step4() { 98 //... 子类重写实现 99 } 100 }; 101 102 103 104 105 int main() 106 { 107 Library* pLib=new Application(); 108 lib->Run(); 109 110 delete pLib; 111 } 112 }

 

posted @ 2016-01-23 14:22  wangxiaobao1114  阅读(968)  评论(0编辑  收藏  举报