0 外观模式和模板模式
外观模式实现的是多各类协作共同完成一件事情,因此我们使用一个函数来封装这些操作,(将这个函数放在一个类中)。
模板模式实现的是一个类的多个函数组合完成一件事情,虽然类的每个函数可能有不同的实现方式,但是流程是一样的。因此使用继承方式,在类中新建一个函数依次调用其他的成员函数。
模板模式中将一个大函数拆分为小函数,然后又将小函数封装为一个函数。
1 外观模式
1.0 需求
要做某件事情,需要多个类的协作。如果不适用外观模式,那么用户代码将是:串行的一个一个的调用各个类的方法,完成一件事情。这样的过程显然不容易维护,一旦这个步骤需要发生改变,那么就需要修改所有的代码。
而外观模式,则是,使用一个类将这些动作封装在一个函数中。类似于迪米特法则。
如果需要参数,那么就在这个函数中一次性提供。
1.1 实现
class A
{
public:
void do();
};
class B
{
public:
void do(int i);
};
class C
{
public:
void do(string str);
};
class Run
{
public:
// 可以不是static
static void do(int ,string)
{
//内部依次生成,并调用ABC的方法
}
// static void do(A,B,C)
// {
// //另一种实现
// }
}
1.2 缺点
外观模式和简单工厂模式一样,都是具体实现的代码移植一个单独的函数中。因此是不符合迪米特法则的。但是他将未来可能修改的代码封装在一起。
其实外观模式就是个函数。为了复用而存在的函数
2 模板模式
2.0 需求
模板模式扩展了外观模式,当做同一件事情,但是这件事情中可以细分出来的一个步骤可以有不同实现。
模板模式的实现是基于虚函数的重载实现的。
外观模式只是封装了各个类的调用。而模板模式则是加了继承,采用多态的方式来实现统一操作的不同实现。
2.1 实现
实现上就是,使用一个虚基类,定义各种操作,以及一个总的方法,这个方法是外观模式中总的调用的类。
class ABCook
{
public:
void do()
{
//依次调用下面的函数
}
virtual void hot();
virtual void put_eg();
virtual void cook();
};
class EggCook:public ABCook
{
public:
//将需要改变的方法 覆写
virtual void put_eg()
{
// 覆写
}
};
3 总结
当各个步骤的实现只有一种的时候可以选用,外观模式。
当存在可能的扩展的时候,就需要使用模板模式来同一操作。
虽然都是封装操作,但是外观模式和模板模式差距还是挺大的。