一、对象模式所属类别简介-组件协作模式
组件模式通过晚绑定来实现松耦合(virtual)
组件协作模式包含以下三种:
TemplateMethod
Observer(event)
strategy
二、当前模式简介-TemplateMethod
TemplateMethod
三、需求
有五个步骤,dll库编写者写135步骤,应用层编写者写24步骤。
四、设计一
#include <iostream>
using namespace std;
class Library
{
public:
void step1(){ std::cout << "step1" << std::endl;}
void step3(){ std::cout << "step3" << std::endl;}
void step5(){ std::cout << "step5" << std::endl;}
};
class Application
{
public:
void step2(){ std::cout << "step2" << std::endl;}
void step4(){ std::cout << "step4" << std::endl;}
};
int main()
{
Application application;
Library library;
library.step1();
application.step2();
library.step3();
application.step4();
library.step5();
return 0;
}
//打印
step1
step2
step3
step4
step5
五、需求更改
无
六、设计一更改版本
无
七、违反原则
1.违反重构b 早绑定,main里面在编译的时候就要把1-5个步骤绑定起来,使用虚函数是可以实现运行时再绑定。
八、设计二
#include <iostream>
using namespace std;
class Library
{
public:
virtual ~Library() {};
void run() //稳定骨架
{
step1();
step2();
step3();
step4();
step5();
}
protected:
void step1(){ std::cout << "step1" << std::endl;} //稳定(普通函数)
void step3(){ std::cout << "step3" << std::endl;} //稳定(普通函数)
void step5(){ std::cout << "step5" << std::endl;} //稳定(普通函数)
virtual void step2() = 0; //变化(使用虚函数)
virtual void step4() = 0; //变化(使用虚函数)
};
class Application : public Library
{
public:
~Application() {};
protected:
void step2(){ std::cout << "step2" << std::endl;}
void step4(){ std::cout << "step4" << std::endl;}
};
int main()
{
Library *library = new Application();
library->run();
return 0;
}
//打印
step1
step2
step3
step4
step5
九、设计二更改版本
无
十、设计二比设计一区别
1.一个使用了虚函数,延迟绑定
十一、模式定义
先定义一个骨架(稳定的主流程),子步骤留到子类实现。
十二、模式结构
十三、要点总结
稳定-不写成虚函数,不稳定-写成虚函数
run(骨架)要稳定
不要调用我,我调用你,反向控制——晚绑定
没有用的不要public出来,统一protected(比如子类的变化步骤)
几乎有用到虚函数,就是template模式