从封装角度对设计模式分类,
一:组件协作
组件协作模式通过晚绑定来实现框架与应用程序的松耦合,很好的应对变化
1:模板方法(Template Method)
//没有采用设计模式的类设计: (1): //程序库开发人员写的 class Library { public: void step1() { //... } void step3() { //... } void step5() { //... } }; (2): //应用程序开发人员写的 class Application { public: void step2() { //... } void step4() { //... } }; int main() { Application app(); Library lib(); lib.step1(); if(app.step2()) { lib.step3(); } for(int i = 0; i < 4; i++) { app.step4(); } lib.step5(); }
(1)是先前早写好的,(2)是后来开发人员写的。它俩之间的关系是(2)调用(1),属于早绑定。
//采用设计模式的类设计: (1): //程序库开发人员写的 class Library { public: void Run() { lib.step1(); if(app.step2()) //支持变化--->虚函数的多态调用 { lib.step3(); } for(int i = 0; i < 4; i++) { app.step4();//支持变化--->虚函数的多态调用 } lib.step5(); } //基类的析构函数成虚函数,以防子类析构函数无法被调用 virtual ~Library() { } protected: step1() { //...稳定 } step3() { //...稳定 } step5() { //....稳定 } }; //纯虚函数,实现由子类来完成,支持子类的变化 virtual bool step2() = 0; virtual void step4() = 0; (2): //应用程序开发人员写的 class Application { protected: bool step2() { //....重写虚函数 } void step4() { //...重写虚函数 } }; int main() { //多态指针,声明类型为Library,实际类型为Application Library *lib = new Application(); lib.Run(); delete lib; }
(1)调用(2),属于晚绑定。