Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Uml 将访问者模式作为单个类的扩展机制应用_Uml_Design Patterns_Visitor - Fatal编程技术网

Uml 将访问者模式作为单个类的扩展机制应用

Uml 将访问者模式作为单个类的扩展机制应用,uml,design-patterns,visitor,Uml,Design Patterns,Visitor,假设在我的程序中有一个名为Robot的类,它继承自其他类 到目前为止,我在Robot中有一些方法,比如addPart或getCost。现在我被要求向它添加一个新的功能模块(一些使用它的部分的方法),但是他们明确要求添加新模块,而对当前类几乎没有影响 我认为一个访问者可以解决这个问题,但问题是我不会将模式应用到层次结构中。这是正确的做法吗?(正如您所看到的,我的机器人是组合的一部分) 基本上,我同意你的方法。您已经成功地确定了一种方法,该方法允许您扩展Robot(零件组合),而无需实际修改Robo

假设在我的程序中有一个名为
Robot
的类,它继承自其他类

到目前为止,我在
Robot
中有一些方法,比如
addPart
getCost
。现在我被要求向它添加一个新的功能模块(一些使用它的部分的方法),但是他们明确要求添加新模块,而对当前类几乎没有影响

我认为一个
访问者可以解决这个问题,但问题是我不会将模式应用到层次结构中。这是正确的做法吗?(正如您所看到的,我的
机器人
是组合的一部分)


基本上,我同意你的方法。您已经成功地确定了一种方法,该方法允许您扩展Robot(零件组合),而无需实际修改Robot类。我唯一要做的改动如下:

我将引入一个名为IPartsComposite的新接口,它将定义Accept方法。该接口将由机器人实现,因为它由部分实例组成

基本访问者将是一个基本泛型类或接口,即访问者。此类型将定义单个方法访问(T)。然后,在您的例子中,您将有三个访问者的具体实现

  • PartsVisitorService
  • PartsVisitor成本
  • 零件视觉制作

在这些具体的类中,您将实现访问(IPartsComposite)

基本上,我同意您的方法。您已经成功地确定了一种方法,该方法允许您扩展Robot(零件组合),而无需实际修改Robot类。我唯一要做的改动如下:

我将引入一个名为IPartsComposite的新接口,它将定义Accept方法。该接口将由机器人实现,因为它由部分实例组成

基本访问者将是一个基本泛型类或接口,即访问者。此类型将定义单个方法访问(T)。然后,在您的例子中,您将有三个访问者的具体实现

  • PartsVisitorService
  • PartsVisitor成本
  • 零件视觉制作

在每一个具体的类中,您都将实现Visit(IPartsComposite)

实际上,我认为我现在对这种方法有一个问题。每个Visit函数都应该返回不同的结果,所以我不知道这个模式现在是否适用于此。@user2313248您可以更改Visit的签名以返回一个通用的结果对象。结果可能会包含每种不同的回报类型。实际上,我认为我现在对这种方法有一个问题。每个Visit函数都应该返回不同的结果,所以我不知道这个模式现在是否适用于此。@user2313248您可以更改Visit的签名以返回一个通用的结果对象。结果可以包装每个不同的返回类型。