首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代理类的优点是什么?

问代理类的优点是什么?
EN

Software Engineering用户
提问于 2018-12-05 00:23:19
回答 2查看 727关注 0票数 0

我一直在学习c++中的代理类。我真的不认为使用代理类的好处,因为它们在隐藏信息方面并不比私有成员更好。与普通私有成员相比,代理类提供了哪些优点和/或缺点?

注意:我使用的是找到这里的“代理”定义。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2018-12-05 07:52:38

重要的初步评论

首先,你不应该在目录中选择一个设计模式,因为它是时尚的,或者是通过考虑优势和不便。如果设计模式与您所遇到的问题相对应,并且适合您的设计,那么您应该选择它。

此外,模式并不只有一个句子的定义。模式是由意图(目的是什么)和它们的结构(如何实现目的)的组合来定义的。

代理

这就是说,你所描述的是一种旨在改变对象界面的模式。这更像是一个适配器(尽管在这里它也不是一个紧密的匹配)。

链接问题中的其他帖子建议使用代理模式来添加操作符。但增加新的责任是装饰模式的目标。

代理模式根据GoF提供一个占位符对象(具有相同的接口),以控制对原始对象的访问。

所以,如果你没有特殊的需求,这种模式就没有优势。

然而,有几种情况下,代理是真正有用的。例如:

  • 如果您的对象是在远程服务器上管理的,则可以使用本地代理通过网络接口将操作转发到远程对象。
  • 如果您的对象正在消耗资源,并且大部分时间都存储在磁盘上,则可以使用代理充当占位符。然后,代理将在需要时反序列化对象,并转发操作(例如缓存)。
  • 例如,如果要添加访问控制,请确保对象是只读的(通过用存根替换任何更改的操作),或者在真正执行操作之前进行基于用户的访问控制(例如,如果用户获得授权,则执行操作,如果不是,则抛出访问控制异常。具有将对象的行为与访问控制分离开来的优点)
票数 5
EN

Software Engineering用户

发布于 2018-12-05 09:39:36

关于术语的说明:

你说的不是代理。它最常用的名称是"pImpl",是“指向实现的指针”的缩写。它是C++编译模型特有的一种模式。

使用pImpl的原因是为了保持与类使用者的二进制兼容性,即使是在实现不断变化的情况下。

作为素描

Foo.h:

代码语言:javascript
复制
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

代码语言:javascript
复制
#include <Foo.h>

void DoStuff()
{
    Foo foo;
    foo.bar(0);
}

Foo.cpp

代码语言:javascript
复制
#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。

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/382475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档