zoukankan      html  css  js  c++  java
  • 使用静态函数impl模式做接口

    使用静态函数impl模式做接口#

    impl即桥接模式,主要是为了隐藏数据和减少不必要的编译。
    普通的impl模式做接口一般是:

    A类是接口,B类继承A类,是A类的实现,C类,包含A类和B类的头文件,把B类对象指针,转做为基类指针,给使用者。代码示意如下:

    // a.h
    class A{ // 接口类 纯虚函数
    	virtual  void add();
    };
    ///////////////////////////////////////////
    // b.h
    #include "a.h"
    class B:public A{ // 接口实现类
    	void add();
    }
    /////////////////////////////////////////
    //
    #include "a.h"
    #include "b.h"
    class C{ // 给使用者的类
    	A* GetA(){
    	    return new B();
    	};
    }
    /////////////////////////////////////////
    // c.cpp
    #include "b.h"
    #include "c.h"
     // 类c的实现
    	A* C::GetA(){
    	    return new B();
    	};
    }
    

    但是这样,用了三个类(也有是把第三个类用全局函数或全局对象代替),给使用者至少暴露两个类的头文件A和C;

    最近有在看webrtc的音频模块时,看到使用静态函数的方法获取实现类对象,感觉很是精巧,对实现的隐藏性更好,也达到了减少文件暴露,使用者只要包含接口文件即可。

    // a.h
    class A{ // 接口类 
        static A* GetA(); // 静态函数,在实现类B的cpp文件实现
    	virtual  void add();
    };
    ///////////////////////////////////////////
    // b.h
    #include "a.h"
    class B:public A{ // 接口实现类
    	void add();
    }
    ///////////////////////////////////////////
    // b.cpp
    A* A::GetA(){
        return new B();
    }
    

    调用静态函数getA()就可以获取实现类B的对象,对于使用者,只需要给接口类A的头文件,甚至使用者根本不知道实现类B的存在。

  • 相关阅读:
    UVALive 6909 Kevin's Problem 数学排列组合
    UVALive 6908 Electric Bike dp
    UVALive 6907 Body Building tarjan
    UVALive 6906 Cluster Analysis 并查集
    八月微博
    hdu 5784 How Many Triangles 计算几何,平面有多少个锐角三角形
    hdu 5792 World is Exploding 树状数组
    hdu 5791 Two dp
    hdu 5787 K-wolf Number 数位dp
    hdu 5783 Divide the Sequence 贪心
  • 原文地址:https://www.cnblogs.com/weiweisuhe/p/6012079.html
Copyright © 2011-2022 走看看