2012-11-22 2 views
1

나는 당신이 이미 만든 도형을 선택하여 복합 도형을 만들 수있는 옵션이있는 도형 (정사각형, 직사각형 및 원)을 만들 수있는 프로그램을 만들고 있습니다 ... 저는 모양에 대해 두 명의 관찰자를 사용합니다. 하나는 사각형/직사각형에 대한 것이고 다른 하나는 큰 원에 대한 것이고이 관찰자는 도형의 참조 점과 크기를 나열합니다. 복합 모양이 만들어지면 복합 모양에 사각형/직사각형이 있으면 사각형/사각형 프레임의 구성 요소를 나열해야합니다.자바에서 복합 패턴

복합 패턴을 사용하여 복합 모양을 작성한다고 가정합니다. 기본적으로 복합 형체와 내 원, 사각형 및 사각형은 같은 방법으로 처리해야합니다.

저는 도형이라고 불리는 객체 배열을 가지고 있으며 복합 형체는 그 안에 도형이 배열 된 객체입니다.

제 질문은 어떻게 형체 형태의 객체에 대한 모양 배열을 확인한 다음 사각형 또는 사각형의 인스턴스에 대한 복합 모양 배열을 검사 할 수 있습니까?

코드를 포함하지만 내 프로그램 클래스

의 많은 다소 큰되지 죄송를 heres 나는이 두 가지 방법은 두 개의 서로 다른 클래스에 ... 정사각형 또는 직사각형의 인스턴스를 확인하는 데 사용하는 방법. 셰이프는 단순한 모양이지만 컴파운드 모양이 표시되지 않을 때 오른쪽 옵저버 창에 표시됩니다. 예를 들어 3 개의 도형 목록이있는 경우 ... 모양 1은 큰 원, 모양 2는 복합 모양 및 모양 3은 사각형입니다. 그리고 복합 형체가 2 개의 정사각형을 가지고 있다고 말할 수 있습니다. 지금이 큰 원과 직사각형을 표시하지만 복합 형 구성 요소를 표시하지 않을 것입니다. 나는 내가 compoundShape에 도착하면,의 instance를 heres 화합물이 toString 메소드에게 내가 찾기 위해 사용

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

을 heres DO 방법을 모양 compundshape 배열

에서의 인스턴스의 정사각형 또는 직사각형을 골라 볼 것이라고 생각 정사각형 또는 직사각형을 heres

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; 
} 
+0

숙제를하는 것처럼 들리는데 ... "확인"해서는 안됩니다. 복합 클래스 공용 인터페이스를 통해 추상화하고 사용할 수 있도록하기 위해 어떤 동작이나 특성이 필요합니까? 또는 공유 인터페이스를 통해 모든 셰이프를 공유 할 수 있습니다. – SAJ14SAJ

+0

'instanceof' 연산자를 사용하여 배열의 요소가 * CompoundShape * 클래스의 인스턴스인지 확인할 수 있습니다. – vbence

+0

사실 그렇지만 숙제가 가르치려는 정신이 아닙니다. – SAJ14SAJ

답변

1

"복합 패턴"이해야 할 일이라고 생각합니다. Wikipedia에 Accordint :

클라이언트 개체의 조성 및 개별 개체 내 이해

가 같이 수행되어야 차이 무시한다 (추가 게터/세터/제거 작업을 생략)

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; 
    } 
} 
+0

이 답변에서 말하는 것은 사실이지만 객체 지향적 인 실천이 아니며 숙제가 가르치고있는 것이 거의 확실하지 않습니다. 모든 셰이프, 복합, 원 또는이 기술의 필요성을 추상화해야하는 모든 요소에 의해 구현되는 공유 인터페이스입니다.이 기술은 추상 메타 코딩에 대한 리플렉션이있는 경우에만 사용해야합니다. – SAJ14SAJ

+0

@ SAJ14SAJ 틀림없이, 질문 자체가 오해의 소지가 있으므로, 그는 수업을 어떻게 구별 할 것인지 묻습니다. 위키피디아를 확인한 후, 그것은 복합 패턴이해야하는 것과 완전히 반대입니다. – vbence

+0

@ SAJ14SAJ 이건 어때? – vbence