一点背景:
我目前正在完成我的 OOP 课程中的一项任务,其中包括围绕各种设计模式设计和实现电话簿管理器。
在我的项目中,所有动作都围绕着 3 个类发生:
PhoneBook
;Contact
(存储在电话簿中的类型);ContactField
(存储在 中的字段Contact
)。
ContactManager
必须提供一种以 2 种模式迭代其联系人的方法:未过滤和基于谓词过滤;Contact
必须提供一种迭代其字段的方法。
我最初决定如何实施:
我遇到的所有设计模式书籍都推荐对接口进行编码,所以我的第一个想法是从上述每个类中提取一个接口,然后让它们实现它。
现在我还必须创建某种多态迭代器以使事情顺利进行,因此我调整了Java 迭代器接口来编写前向迭代器。
问题:
这种设计的主要挫折是我失去了与 stl 的互操作性
<algorithm>
以及基于范围的 for 循环提供的语法糖。我遇到的另一个问题是
Iterator<T>::remove()
功能。如果我想要一个可以改变它迭代的序列(删除元素)的迭代器,那么一切都很好,但是如果我不想要这种行为,我不确定该怎么做。我看到在 Java 中可以抛出
UnsupportedOperationException
这不是那么糟糕,因为(如果我错了,请纠正我)如果未处理异常,则应用程序将终止并显示堆栈跟踪。在 C++ 中,您并没有真正拥有这种奢侈(除非您运行附加的调试器,我认为),老实说,我宁愿在编译时捕获此类错误。
解决这种混乱的最简单方法(我看到)是避免在可迭代类型上使用接口,以适应我自己的 stl 兼容迭代器。这会增加耦合,但是我不确定从长远来看它是否真的会产生任何影响(当然不是这个项目很快就会变成丢弃的代码)。我的猜测是不会的,我也想在继续我的设计之前听听长辈的意见。