软件领域中的设计模式的重要性不言而喻。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态。虽然知道这些特性的定义但是并没有做到真正的理解,这样特性有什么作用?用于什么场合中等等问题,带着疑问开始学习设计模式,主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。
如果类中用了继承,并且肯定这个继承有意义,就应该要成为子类的模板,所有重复的代码都应该要上升到父类中去,而不是让每个子类都去重复。
这时就要用到模板方法了,当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。
模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
特点:把不变的代码部分都转移到父类中,将可变的代码用virtual留到子类重写
例:
#include<iostream>
#include <vector>
#include <string>
using namespace std;
class AbstractClass
{
public:
void TemplateM()//模板方法
{
cout << "我是" << GetName() << endl;
//把GetName声明为一个虚方法
}
protected:
/*GetName此方法的目的就是为了给子类重写
模板特点就是把不变的代码部分都转移到父类中,
将可变的代码用virtual留到子类重写,
这里可变的代码就是GetName方法*/
virtual string GetName() = 0;
};
class ConcreteClass1 : public AbstractClass
{
protected:
virtual string GetName()
{
return "齐天大圣孙悟空";
}
};
class ConcreteClass2 : public AbstractClass
{
protected:
virtual string GetName()
{
return "噼里啪啦无敌美少女";
}
};
//客户端
int main()
{
AbstractClass* man = new ConcreteClass1();//多态
man->TemplateM();
AbstractClass* man2 = new ConcreteClass2();//多态
man2->TemplateM();
return 0;
}
迪米特法则
如果两个类不直接通信,那么这两个类就不应当发生直接的相互作用。如果一个类需要调用另一个类的某个方法的话,可以通过第三个类转发这个调用。
在类的结构设计上,每一个类都应该尽量降低成员的访问权限。
迪米特法则的根本思想,是强调了类之间的松耦合。类之间的耦合性越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及,也就是说信息的隐藏促进了软件的复用。
该法则在后面的适配器模式、解释模式等中有强烈的体现。