Java实现和UML规范wrt接口和抽象类之间的区别

时间:2015-12-06 12:40:41

标签: java design-patterns interface uml abstract-class

存在各种类似外观的问题,但我找不到任何响应我的查询的问题。在实现接口时具有指定聚合关系的可能性是我的问题的一个重要部分,在其他类似问题或其他问题中不予处理的解决方案。

我的问题涉及Java中设计模式的实现。为了便于解释,我考虑了此图中所示的Command设计模式。Class Diagram

由于这个UML表示需要" Invoker"应该是一个接口,并且它还应该与"命令"具有N-ary聚合关系。接口,如果我将Invoker定义为Java接口,则无法实现它,因为我无法在Java接口中声明non-static non-final属性,而我需要定义一个&{34;命令" non-final Collection用于建立" Invoker"之间的聚合关系的对象和"命令"。

所以,我继续将Invoker实现为一个抽象类,它允许我进行聚合,并为&#34; Invoker&#34;的实现提供抽象。但是我想知道它是否是一个好的设计实践,因为UML确实有一个构造型<<abstract>>但是这个模式的UML类图明确指定使用接口而不是抽象类。 我也为#34;主题&#34;做了同样的事情。 &#34; Observer&#34;的界面Java中的模式实现有类似的原因。

请告诉我是否有办法保持&#34; Invoker&#34;作为Java中的接口,仍然实现与指定多重性的聚合关系。 如果我所做的是最好的方法,请告诉我是否可能对我使用这种模式构建的程序的结构产生一些负面影响。

添加命令模式的简短Java实现的类图下面,我提出这个实现以增强问题的清晰度。我配置了&#34; Controller&#34;在这里作为&#34;祈求者&#34;可以以不同方式实现的接口,例如, &#34; InfraredRemote Controller&#34;在这个图中。但是&#34; Invoker&#34;之间聚合关系的设计模式要求。和&#34;命令&#34;接口使我配置&#34;控制器&#34;作为一个抽象类,因为当我配置&#34; Controller&#34;时,我找不到任何方法来实现所需的多样性和关系。作为一个界面。 Java Implementation

2 个答案:

答案 0 :(得分:1)

命令模式中的重要部分是所有ConcreteCommand都有一个共同的Command “interface”,它隐藏了整个命令逻辑和所有可能的Receiver }秒。这会将一堆代码转换为一个对象,任何人都可以在不知道系统其余部分的情况下执行。依赖倒置原则的依赖性方向在这里很重要。

我甚至不需要实现此模式来实现Command “interface”interface。关键是需要隐藏细节的东西。如果您针对要在Java中实现的具体问题制定具体的UML系统设计并将命令标记为<<interface>>,则会出现另一个故事。

CommandInvoker之间的关系也不是调用者“interface”( - 合约)的一部分。客户不应该在意。它只是看到它可以传递命令。 n-ary聚合的意图可能是表明调用者可以采用任何类型/数量的Commands。在Command s&amp; Client知道(这种关系也没有必要,命令可以某种方式找到他们的方式来比较一些调用者this)。模式本身并不要求Invokerinterface。它可能是具体的,因为具体实现仍然具有“interface”

命令模式的一个常见应用是让一个调用程序跟踪已应用命令的跟踪,并允许撤消它们。在这种情况下,具体调用者和命令之间存在强关系,其中调用者将命令存储在一些列表中。该图也可能意味着。您通常在模式图中根本没有这种关系。请再次查看上面的链接。

无论这意味着什么,我都会说你不应该在Command InvokerInvokerInvoker之间实现具体关系,以防你决定interface }和<<interface>>。这将超过此图表所示。它还会强制所有的调用者都有特定的行为。而这不是这种模式的重点。

<<abstract>>X构造型只有在设计图表的人实际上意味着Java等价物时才有意义。当图表显示一个概念时,通常情况并非如此,其中任何不相关的东西都将成为一个界面。这同样适用于关系。 “聚合”可以非常自由地使用。在调用者&lt;&gt;命令关系的情况下它可能意味着调用者已经看到所有命令,它不必存储它们。

答案 1 :(得分:1)

感谢与@zapl进行了良好的头脑风暴会议以及更多关于网络的研究,我通过this文章找到了答案,该文章引用了一本非常有趣的书的this页面。

  

“程序到界面”,实际上意味着“程序到超类型”。    - 首先,设计模式

显然,使用word&#39; Interface&#39;在设计模式的UML规范中更通用,只表示抽象,即。 supertype,可以通过使用Interface或抽象类在Java实现中实现。虽然UML中存在<<abstract>>类的构造型,但它们很少用于描述设计模式。

由于无法在Java接口之间实现n-ary多重性,因此UML&#34; Invoker&#34;在我的问题中使用的示例中的接口需要使用Java接口实现,该接口由抽象类实现,并通过使用具体的Invoker子类扩展该抽象类。这将保持代码的可塑性,同时保留抽象,如下面的实现所示:Java implementation

客户端&#34;实施者&#34;使用由Java抽象类实现的Java接口来提供多重性&#34; Command&#34;界面和对具体Invokers的多样性的访问;这两个一起代表了&#34;祈求者&#34;命令设计模式的UML规范中的接口。

到目前为止,我的答案仍然悬而未决,希望对我可能错过的内容发表评论。如果我没有得到任何答案,我会在两天内接受我的回答。