对称访客模式

时间:2012-08-18 15:23:54

标签: c++ oop design-patterns visitor

我正在使用访问者模式在某些类上定义一组操作 有些操作是可交换的,所以我最终在访问者模式代码中重复 假设我有ABC类,操作:A * A,A * B,A * C,B * A,B * B,B * C,C * A,C * B,C * C. A * A,B * B,C * C是唯一的 A * B,B * A和朋友将有代码重复 我可以实现A * B,并使B * A调用A * B,但我最终会问自己:我在哪个文件中再次实现A和B之间的操作,在A或B中? (会有大约6个班级,所以我会问很多这个问题.15对可能的操作)
在实施新操作时,将来有人会冒A + B无限循环呼叫B * A呼叫A * B的风险。
有一个约定决定哪个应该实现A * B或B * A是不自然的 我可以创建一个第三个文件,其中包含所有已实现的函数,这些函数由A * B和B * A调用,看起来不是面向对象的。 你会如何解决这个问题? 由于
(我可以列出一些代码,但它很长,并没有很容易说明这一点)

2 个答案:

答案 0 :(得分:4)

你是对的,你绝对不应该A*B来实施B*A。除了可能创建无限的调用链之外,该方法不会反映代码中操作的对称性,因为代码不是对称的。

更好的方法是在助手类或顶级函数中实现“对称”操作,具体取决于您的语言支持的内容,然后同时生成A*BB*A称之为帮助实现。

答案 1 :(得分:1)

我的建议是使用构建器,它将作为参数构建器

new ParameterBuilder()
    .setFirst( "A" )
    .setSecond( "B" )
    .setThird( "C" )
    ...
    .build();

然后你将只有一个以ParameterBuilder为参数的方法。