假设我正在为类 A 编写一个接口(interface),它保留类型 B 的对象列表,并且我希望能够通过类 A 的接口(interface)操作该列表。我可以将 add_B、remove_B 等方法放在 A 的接口(interface)中,但这样会造成大量代码重复(这种情况在我的程序中的许多类中都会出现),所以我宁愿返回对列表本身的引用。然而,这会破坏封装。
有没有标准的方法来处理这种情况?
最佳答案
下面的代码基于代理设计模式。它通过将接口(interface)委托(delegate)给“代理”对象来保留封装并避免“A”中的庞大接口(interface)。
另请注意 typedef 如何允许自由地将“list”更改为“vector”或其他任何内容。
struct B{};
struct A{
struct containerproxy{
void Add(B *pb);
void Remove(B *pb);
};
friend struct containerproxy;
containerproxy &GetProxy(){return mlprx;}
typedef containerproxy intf;
~A(){
// Code to delete list elements and cleanup the list
}
private:
containerproxy mlprx;
list<B*> mlp;
};
void A::containerproxy::Add(B *pb){ /*code to add pb to mlp*/}
void A::containerproxy::Remove(B *pb){/*code to remove pb from mlp*/}
int main(){
A a;
A::intf &r = a.GetProxy();
B *p = new B;
r.Add(p);
}
关于c++ - 通过 C++ 类接口(interface)处理序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3690136/