设计模式-外观模式(结构性)、模板模式(结构性)

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 总结

当各个步骤的实现只有一种的时候可以选用,外观模式。

当存在可能的扩展的时候,就需要使用模板模式来同一操作。

虽然都是封装操作,但是外观模式和模板模式差距还是挺大的。

原文地址:https://www.cnblogs.com/perfy576/p/8550394.html