设计模式之模式方法——C++

一、类别

	Template Method属于组件协作模式。
	组件写作模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。
	典型模式:Template Method、Observer / Event、Strategy

二、定义

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

三、代码对比

背景:对于应用程序的开发,一般是先创建Library,再创建Application,然后按照固定的步骤开始运行。

  • 结构化软件实现方法:
class Library
{
public:
        void step1()
        {
               cout << "step1" << endl;
        }
        void step3()
        {
               cout << "step3" << endl;
        }
};

class Application
{
public:
        void step2()
        {
               cout << "step2" << endl;
        }
        void step4()
        {
               cout << "step4" << endl;
        }
};

int main()
{
        Library lib;
        Application app;
        lib->step1();
        app->step2();
        lib->step3();
        app->step4();
        system("pause");
        return 0;
}

这是一种早绑定:先实现Library,实现的具体流程在Application中,具体流程的实现依赖于Library。

  • 采用Template Method
class Library
{
public:
        void run()
        {
            step1();
            step2();
            step3();
            step4();
        }
protected:
        void step1()
        {
               cout << "step1" << endl;
        }
        void step3()
        {
               cout << "step3" << endl;
        }
        virtual void step2() = 0;
        virtual void step4() = 0;
};

class Application : public Library
{
protected:
        virtual void step2()
        {
               cout << "step2" << endl;
        }
        virtual void step4()
        {
               cout << "step4" << endl;
        }
};

int main()
{
        Library *lib = new Application;
        lib->run();
        system("pause");
        return 0;
}

这是一种晚绑定:先实现Library,Library中有实现流程,其中的流程依赖于较晚实现的Application。

四、要点总结

  • Template Method用虚函数的多态性为应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。
  • 除了可以灵活应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构的Template Method的典型应用。
  • 在具体实现方面,被Template Method调用的虚函数推荐设置为protected方法,因为其只是框架的一步,不需要开放给外界,所以不该为public。同时,它也不应属于private。
上一篇:教我兄弟学Android逆向04 动态调试smali代码


下一篇:Eclipse user library位置