在java中的复合模式

时间:2012-11-22 23:37:23

标签: java composite

我正在制作一个程序,允许你创建形状(方形,矩形和圆形),你也可以选择通过选择已经创建的形状来创建复合形状...我正在使用两个观察者形状。一个用于正方形/矩形,一个用于大圆圈,这些观察者列出了参考点和形状的大小。创建复合形状时,如果复合形状中有正方形/矩形,则应在方形/矩形框中列出组件。

我应该使用复合图案创建复合形状。所以基本上复合形状和我的圆形,正方形和矩形需要以相同的方式处理

我有一个名为shapes的对象数组,复合形状是一个带有形状数组的对象。

我的问题是如何通过形状数组检查复合形状类型的对象,然后通过复合形状数组检查矩形或方形的实例?

很抱歉不包含代码,但我的程序有点大,有很多类

继承我用来检查方形或矩形实例的方法......这两种方法分为两个不同的类。当形状只是简单的形状但复合形状不显示时,形状会显示在右侧观察窗口中。例如,如果我有3个形状的形状列表...形状1是大圆形,形状2是复合形状,形状3是矩形。并且假设复合形状有2个方格。现在,这将显示大圆和矩形,但它不会显示复合形状组件。我想,一旦我进入compoundShape,instanceof会从compundshape数组中挑出一个方形或矩形的实例

继承复合形状toString方法

public String toString(){
    String output="";
    output += "Compound Shape: /n";
    for (int i = 0; i< numShapes; i++){
        output += shapes[i].toString();
    }
    return output;
}

继承人我用来寻找方形或矩形的实例的方法

do {//squares rectangles
        currentShape = shapes.getShape();
        if (shapes.squareRectangleFinder())
            outputString1 += currentShape.toString();
    }while (shapes.next());

并且是方形探测器方法

public boolean squareRectangleFinder() {
    if ((shapes[currentShape] instanceof Square)||(shapes[currentShape] instanceof Rectangle)){
        return true;
    }
    return false;
}

1 个答案:

答案 0 :(得分:1)

我想这就是“复合模式”应该做的事情。 Accordint Wikipedia

  

客户应该忽略对象组合和单个对象之间的区别

根据我的理解,它应该像这样(getters / setters,省略添加/删除操作):

interface Shape {
    public int getLeftmostCoordinate();
}

class Rectangle implements Shape {
    private int top;
    private int left;
    private int width;
    private int height;

    public int getLeftmostCoordinate() {
        return left;
    }
}

class Circle implements Shape {
    private int x;
    private int y;
    private int r;

    public int getLeftmostCoordinate() {
        return x - r;
    }
}

class CompoundShape implements Shape {
    private Shape[] shapes;

    public int getLeftmostCoordinate() {
        int left = shapes[0].getLeftmostCoordinate();

        for (int i=1; i<shapes.length; i++) {
            int candidate = shapes[i].getLeftmostCoordinate();
            if (candidate < left) {
                left = candidate;
            }
        }

        return left;
    }
}