面向对象的设计原则:高内聚、低耦合
软件重构原则:小步快跑------抽取的思想(抽取函数、抽取类、抽取接口);对扩展开放、对修改封闭
设计模式分类如下:
在面向对象系统的分析和设计过程中经常会遇到一种情况:对于某个逻辑实现(算法实现)在不同的对象中有不同的细节实现,但是框架是相同的。Templete模式是采用继承的方式来实现这一点,将框架放到基类中,定义好细节的接口,子类中实现具体的细节。类似于HOOK。说白了:父类TempleteMethod方法调用Primitive1和Primitive2,但是在子类中实现Primitive1和Primitive2。
Templete模式的结构图:
代码实现:
#include "iostream"
using namespace std;
class AbstractClass
{
public:
virtual ~AbstractClass(){}
void TempleteMethod();
protected:
virtual void Operation1()=0;
virtual void Operation2()=0;
AbstractClass(){};
};
class ConcreteClass1:public AbstractClass
{
public:
ConcreteClass1(){};
~ConcreteClass1(){};
protected:
void Operation1();
void Operation2():
};
class ConcreteClass2:public AbstractClass
{
public:
ConcreteClass2(){};
~ConcreteClass2(){};
protected:
void Operation1();
void Operation2():
};
void AbstractClass::TempleteMethod()
{
this->Operation1();
this->Operation2();
}
void ConcreteClass1::Operation1()
{
cout<<"ConcreteClass1 -- Operation1"<<endl;
}
void ConcreteClass1::Operation2()
{
cout<<"ConcreteClass1 -- Operation2" << endl;
}
void ConcreteClass2::Operation1()
{
cout<<"ConcreteClass2 -- Operation1"<<endl;
}
void ConcreteClass2::Operation2()
{
cout<<"ConcreteClass2 -- Operation2"<<endl;
}
int main()
{
AbstractClass * p1 = new ConcreteClass1();
AbstractClass * p2 = new ConcreteClass2();
p1->TempleteMethod();
p2->TempleteMethod();
return 0;
}
注意:将Operation操作定义为Protected,仅供TempleteMethod调用。
Template模式获得一种反向控制结构效果,这也是面向对象系统的分析和设计中一个原则DIP(依赖倒置:Dependency Inversion Principles)。其含义就是父类调用子类的操作(高层模块调用低层模块的操作),低层模块实现高层模块声明的接口。这样控制权在父类(高层模块),低层模块反而要依赖高层模块。