五、外观模式 模板模式
2017-08-07 本文已影响0人
Myth52125
外观模式
提供管理某一类具有对象的一层封装
比如要完成某一工作,需要同时协同某几个对象。为了防止频繁的调用一大堆代码。所以再写一个类,然后封装他们。
其实感觉就像一个函数而已。
例如编译器,他会预处理、编译、汇编、链接。但我们有时候要直接得到最终结果,并不关心过程。
同时我们有时又可以逐项执行。
也好比我们有时候写好多的小函数,然后最后写一个大函数去执行这些小函数。使这些小函数可以复用。
//job共同的基类
class job
{
public:
virtual void do()=0;
};
//同时还有job1、2、3、4等等。
class job1:public job
{
public:
virtual void do();
};
class DoJob
{
public:
DoJob();
void addJob(job* j);
void doJob();
void removeJob(int i);
private:
vector<job*> _list;
};
为什么使用一个抽象基类?其实好像也不用是吧?
不是的,根据依赖倒置,需要这样做。
其中如果仅仅需要默认的功能那么其DoJob
默认构造函数里可以提供。
如果需要执行不同的功能,那么我们不要构造函数,然后自己添加也可以。
如果说仅仅是为了执行一堆对象的某一系列操作,而这些操作本身就没有什么统统的特征,也就是说没有共同的一个基类,那么就没有必要使用抽象层。
模板模式
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤
嗯,就是说,实现一个功能,需要多个步骤,而每个步骤用的工具又可能是不同的。所以那,基类先定义一个完成功能步骤的算法框架。然后子类根据选用工具的不同去实现这一些功能。
比如说,编译器:预处理->编译->汇编->连接。假设,我使用不同的编译器,那他的处理步骤是相同的啊。所以不同的编译器,继承编译器这个基类,然后去实现自己的功能。但是总的算法的框架是不变的。
UML
模板模式代码
class compiler
{
public:
virtual void doit()
{
pretreatment();
compile();
assembly();
link();
}
private:
virtual void pretreatment()=0;
virtual void compile()=0;
virtual void assembly()=0;
virtual void link()=0;
};
//具体的子类
class Gun:public compiler
{
//具体实现
};
模板模式和外观模式很相似,都是封装函数,不同的是外观模式封装的是不同对象的函数。