首先,请参阅这些Java代码:
Drawable.java
package examples.simple.model;
public interface Drawable {
public void draw();
}Shape.java
package examples.simple.model;
public abstract class Shape implements Drawable {
private Point center;
public Point getCenter() {
return center;
}
public void setCenter(Point center) {
this.center = center;
}
}Rectangle.java
package examples.simple.model;
public class Rectangle extends Shape {
public void draw() {
System.out.println("Drawing a rectangle....");
}
}Circle.java
package examples.simple.model;
public class Circle extends Shape {
public void draw() {
System.out.println("Drawing a circle....");
}
}Line.java
package examples.simple.model;
public class Line implements Drawable{
public void draw() {
System.out.println("Drawing a line");
}
}Plotter.java
package examples.simple.client;
import java.util.ArrayList;
import java.util.List;
import examples.simple.model.Circle;
import examples.simple.model.Drawable;
import examples.simple.model.Rectangle;
import examples.simple.model.Shape;
import examples.simple.model.Line;
class Plotter {
public static void main(String[] args) {
List<Drawable> drawables = new ArrayList<Drawable>();
Shape s = new Circle();
drawables.add(s);
s = new Rectangle();
drawables.add(s);
Line l = new Line();
drawables.add(l);
for (Drawable drawable : drawables) {
drawable.draw();
}
}
}这些代码是一个典型的多态例子。这些代码的类图是

当我尝试使用UML序列图来建模这些类以显示多态性时,只使用一个序列图,我需要使用四个注释来表示多态。

那么,如何在没有注释的情况下,将多态调用可视化在一个图中呢?是否还有其他符号或可视化(没有UML序列或通信关系图)来显示多态性?在本例中,如何在drawable.draw()中显示调用Plotter.main()
发布于 2014-08-05 03:22:48
使用工厂方法设计模式-顺序图中提出的思想,多态调用由受保护条件控制的多个场景建模。因此,对于每个多态场景,动态绑定(多态调用)表示为“场景框”。因此,这是一个显示多态调用的单一模型(序列图)。

从字面上讲,作者的文章评论了你的建模策略:
“事实证明,为了模拟操作流程,我实际上是在建模多态、后期绑定和所有这些东西是如何工作的。我想,在这种情况下,序列图不仅无关紧要,而且实际上令人困惑。但我不得不尝试。”
总之,显示多态调用是一项非常重要的任务,我认为对软件工程师来说,清楚地可视化多态性实际上是一个开放的挑战。
发布于 2014-08-02 21:27:15
序列图在显示交互作用方面很强,它们不太适合描述模型的结构特性。
类图可能是您所需要的。下面的图像是一个显示多态性的类图的示例(即getArea方法)。

发布于 2018-02-12 21:55:35
出于我在评论中的原因(每个对象都有自己的生命线,每条消息都是一个调用,等等),在一个图中尝试这样做是很困难的(如果不是不可能的和错误的话)。
此外,多态性的美妙之处在于,在一定程度上(多态调用),我们不想知道细节。对draw()的调用只起作用,而不管实现类是什么。细节隐藏在抽象中。UML图在显示基本信息时非常有用。

在您的回答中,每个形状都只接收到消息draw() (我们没有看到与序列图在行为上有任何区别)。如果您确实需要澄清Circle实现之间的差异等等,我建议在单独的图中表示多态调用,这样我们就可以看到使用了哪些不同的对象来实现draw()功能,例如:

https://stackoverflow.com/questions/25099461
复制相似问题