如何包装C ++库

时间:2017-03-02 12:18:45

标签: oop design-patterns

我正在开发一个使用库的应用程序,我想要包装这个库,这样它就不会深入到我的应用程序代码中。多亏了我可以通过重新实现我的包装类来改变我正在使用的库。

假设我有一个库LibA。它给了我两个可以使用的对象,LibAObj1和LibAObj2。 LibAObj2有​​一个使用LibAObj1的方法。

这可以是他们的声明的简单定义

componentDidUpdate

现在我想定义一个接口,我的应用程序可以使用该接口将这些对象包装在我的应用程序代码中

例如:

class LibAObj1 {};

class LibAObj2 
{
     void action(LibAObj1 &obj);
};

只要我想实现我的界面ItfLibAObj2,就会出现问题。

class ItfLibAObj1 {};

class ItfLibAObj2 
{
public:
     void action(ItfLibAObj1 &obj) = 0;
};

问题实际上是在伪代码中。如何获取我的ItfLibAObj1引用中包含的LibAObj1?我可以在LibAObj1接口中添加一个getter函数来返回一个我将要转换的void指针,但是我在C ++中找不到那么优雅。

我可以用任何一种设计模式来解决我的问题吗?或者我只是有设计问题?

请注意,我不希望选择在运行时使用哪个库。

非常感谢你的帮助。

亲切的问候

1 个答案:

答案 0 :(得分:0)

您的问题完美地解释了为什么在代理模式中,Real和Proxy都必须实现相同的接口:

UML diagram of Proxy Pattern (source: Wikipedia)

您的代码应如下所示:

// interfaces
class ItfLibAObj1 {};

class ItfLibAObj2 
{
public:
     void action(ItfLibAObj1 &obj) = 0;
};

// real

class RealLibAObj1 : public ItfLibAObj1 {};

class RealLibAObj2 : public ItfLibAObj2
{
     void action(ItfLibAObj1 &obj)
     {
         ...
     }
};

// proxy
class ProxyLibAObj1 : public ItfLibAObj1
{
private:
    RealLibAObj1 real;
};

class ProxyLibAObj2 : public ItfLibAObj2
{
private:
    RealLibAObj2 real;

     void action(ItfLibAObj1 &obj)
     {
         // do something
         real.action(obj); // delegate to the real
         // do something
     }
};

但是,如果你的“包装”的整个目的是在你的核心/真实和外部(客户端)之间添加一个新层,请考虑Facade Pattern,它提供了一个更简单的客户端接口,而不是只是模仿核心的类/方法。