五、外观模式 模板模式

外观模式

提供管理某一类具有对象的一层封装

比如要完成某一工作,需要同时协同某几个对象。为了防止频繁的调用一大堆代码。所以再写一个类,然后封装他们。
其实感觉就像一个函数而已。
例如编译器,他会预处理、编译、汇编、链接。但我们有时候要直接得到最终结果,并不关心过程。
同时我们有时又可以逐项执行。
也好比我们有时候写好多的小函数,然后最后写一个大函数去执行这些小函数。使这些小函数可以复用。

//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
{
//具体实现
};

模板模式和外观模式很相似,都是封装函数,不同的是外观模式封装的是不同对象的函数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,123评论 25 709
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 13,154评论 1 51
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,643评论 4 61
  • 封闭性心态 简而言之,就是用自己熟悉的观念,去解释新事物。 他们喜欢从「不同」的事物中寻求「相同」,把共性提取出...
    袁生斌阅读 2,817评论 0 0
  • 朋友小壕结婚,邀请我去为他们唱首歌。 已经有近一年时间没有上台的我,很珍惜这次又可以唱歌给很多人听的机会,我也很想...
    吕燕阅读 5,590评论 7 4

友情链接更多精彩内容