gpt4 book ai didi

java - java中的参数化适配器

转载 作者:太空狗 更新时间:2023-10-29 21:47:04 26 4
gpt4 key购买 nike

我阅读了关于适配器模式的“四人帮”的设计模式。但我在实现部分读到,第 2.c 段谈到可插入适配器使用参数化适配器,但我无法理解,因为示例在 Smalltalk 中。任何人都可以通过 Java 或 C++ 为我解释细节吗?对不起,我的英文太烂了。谢谢

最佳答案

首先,我觉得有必要提醒大家注意不要深入使用模式,尤其是在 C++ 中(许多 C++ 程序员已经开始以一定程度的怀疑态度看待对设计模式的强调) .

也就是说,我怀疑大多数使用 C++ 的人会使用书中讨论的方法。这本书讨论了一种混合类型方法,您可以从一些抽象类继承,这些抽象类定义了您要委托(delegate)给的接口(interface)。在他们的示例中,您将根据一些抽象 DisplayableObject 类编写一个 TreeDisplay 类,然后您将通过(可能是多个,希望是私有(private)的)从 DisplayableObject 继承来创建一些特定类型的 TreeDisplay。

我无法想象有人会以这种方式编写 C++,除非在已经使用此架构的现有项目中。如果有人正在编写新的 C++ 来实现它,他们几乎肯定会将 TreeDisplay 设为模板,并将 DisplayableObject 设为模板参数。

template <class DisplayableObject> 
class TreeDisplay {
DisplayableObject const &root;
public:
TreeDisplay(DisplayableObject const &d) : root(d) {}

display(graphic const *g);

void build_tree(DisplayableObject const &d=root) {
for (auto child : d.get_children) {
add_node(d.CreateGraphicNode(this, child));
build_tree(child); // recursively add child's children
}
}
}

然后可显示对象将具有如下内容:

class DirectoryBrowser { 
std::vector<directory> children;
public:
std::vector<directory> &get_children() { return children; }

void CreateGraphicNode(TreeDisplay *t, directory const &d) {
t->display(d.name);
}
};

这当然与书中讨论的实现相匹配,但正如我上面所说的,我无法想象今天有人以本书讨论的方式编写 C++。顺便说一句,我怀疑很多人会直接返回对 DirectoryBrowser 内部数据的引用——这只是演示一般想法的一种快速而肮脏的方式。

至于所有这一切应该完成的事情:主要是解耦。 TreeDisplay 知道如何在树中显示项目,但不需要知道树中各个对象的详细信息。相反,树中显示的项目不需要知道显示是树的任何信息。如果您选择在平面列表中显示这些相同的项目,那对 DirectoryBrowser(或其他可显示对象)根本没有影响。它只需要知道如何在被要求时将自身的可显示版本发送回函数。

简而言之,我们已经最小化了两者之间的接口(interface),因此可以在不影响另一个的情况下更改任何一个,并且尽可能容易地实现其中一个的不同变体,并让它与所有现有的实现一起工作其他部分。

在 Java 中,我猜大多数程序员可能会定义一个 DisplayableObject 接口(interface)(可能使用不同的名称),并将其用作“插入”点,让 TreeDisplay 与树中的对象交互。虽然 Java 的泛型可能可以用于执行此操作,但我认为这不像在 C++ 中使用模板那样可行(原因大多与手头的问题无关)。

关于java - java中的参数化适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13796681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com