我一直在学习c++中的代理类。我真的不认为使用代理类的好处,因为它们在隐藏信息方面并不比私有成员更好。与普通私有成员相比,代理类提供了哪些优点和/或缺点?
注意:我使用的是找到这里的“代理”定义。
发布于 2018-12-05 07:52:38
首先,你不应该在目录中选择一个设计模式,因为它是时尚的,或者是通过考虑优势和不便。如果设计模式与您所遇到的问题相对应,并且适合您的设计,那么您应该选择它。
此外,模式并不只有一个句子的定义。模式是由意图(目的是什么)和它们的结构(如何实现目的)的组合来定义的。
代理
这就是说,你所描述的是一种旨在改变对象界面的模式。这更像是一个适配器(尽管在这里它也不是一个紧密的匹配)。
链接问题中的其他帖子建议使用代理模式来添加操作符。但增加新的责任是装饰模式的目标。
代理模式根据GoF提供一个占位符对象(具有相同的接口),以控制对原始对象的访问。
所以,如果你没有特殊的需求,这种模式就没有优势。
然而,有几种情况下,代理是真正有用的。例如:
发布于 2018-12-05 09:39:36
关于术语的说明:
你说的不是代理。它最常用的名称是"pImpl",是“指向实现的指针”的缩写。它是C++编译模型特有的一种模式。
使用pImpl的原因是为了保持与类使用者的二进制兼容性,即使是在实现不断变化的情况下。
作为素描
Foo.h:
class FooImpl; // Forward declaration, FooImpl is incomplete
class Foo {
public:
~Foo(); // Need to specify destructor, as the default is ill formed due to the incompleteness of FooImpl
void bar(int);
// etc
private:
std::unique_ptr<FooImpl> pImpl;
};FooUser.cpp
#include <Foo.h>
void DoStuff()
{
Foo foo;
foo.bar(0);
}Foo.cpp
#include <Foo.h>
#include <Bar.h>
#include <Baz.h>
#include <Quux.h>
class FooImpl
{
Bar bar;
Baz baz;
Quux quux;
void do_bar(int) {}
};
Foo::~Foo() {} // Now we have the complete definition of FooImpl, this is well formed
void Foo::bar(int i) { pImpl->do_bar(i); }FooUser.cpp与Foo的实现完全隔离。尤其是,#includes ( Foo需要定义其成员)对FooUser.cpp来说是不可见的。对Foo.cpp的任何更改都不会强制重新编译FooUser.cpp。
https://softwareengineering.stackexchange.com/questions/382475
复制相似问题