如何在单个图中可视化多态调用?

时间:2014-08-02 21:12:24

标签: polymorphism uml modeling

首先,请参阅以下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();
        }
    }
}

代码是多态性的经典例子。这些代码的类图是

enter image description here

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

enter image description here

那么,如何在没有评论的情况下在单个图表中可视化多态调用?是否有其他符号或可视化(没有UML序列或通信图)来显示多态性?在此示例中,如何在drawable.draw()

中显示调用Plotter.main()

3 个答案:

答案 0 :(得分:2)

序列图在展示交互方面非常强大,它们不太适合描绘模型的结构属性。

类图可能就是您所需要的。下图是显示多态性(即getArea方法)的类图示例。

enter image description here

答案 1 :(得分:2)

使用Factory Method Design Pattern – Sequence Diagrams中提出的想法,多态调用由保护条件控制的多重场景建模。因此,对于每个多态方案,动态绑定(多态调用)表示为&#34;方案框&#34;。因此,这是一个显示多态调用的单一模型(序列图)。

Sequence Diagram to represent polymorphic scenarios

从字面上看,作者的帖子评论了你的建模策略:

  

&#34;事实证明,我实际上是对操作流程进行建模   建模多态,后期绑定和所有这些东西的工作原理。一世   猜测在这种情况下,序列图不仅无关紧要,   但实际上令人困惑。但我必须尝试。&#34;

总而言之,显示多态调用是一项非常重要的任务,我认为清晰可视化多态实际上对软件工程师来说是一个开放的挑战。

答案 2 :(得分:0)

由于我在评论中提出的原因(每个对象都有自己的生命线,每个消息都是一次调用等),尝试在单个图表中执行此操作很困难(如果不是不可能和错误的话)。

此外,多态性的美妙之处在于,在某个级别(多态调用),我们不希望知道细节。无论实施类如何,都会调用draw()并且只是工作。细节隐藏在抽象中。 UML图在显示基本信息时非常有用。

enter image description here

在你的回答中,每个形状只接收消息draw()(我们没有看到序列图中的行为有任何差异)。如果你真的需要澄清Circle等实现之间的差异,我建议在单独的图表中表示多态调用,以便我们可以看到使用哪些不同的对象来实现draw()函数,例如:

enter image description here