zoukankan      html  css  js  c++  java
  • 设计模式-外观模式(结构性)、模板模式(结构性)

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

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

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

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

  • 相关阅读:
    Java设计模式之责任链模式
    多线程几个常用方法的实例
    Activiti工作流
    Java线程常用方法汇总
    Java线程的几个概念
    多线程——实现Callable接口
    java对象在JVM堆中的数据结构
    对计算机世界的认知
    wait、notify为什么要放在同步代码块中
    java synchronized关键字的底层实现
  • 原文地址:https://www.cnblogs.com/perfy576/p/8550394.html
Copyright © 2011-2022 走看看