2012-01-08 1 views
1

복합 패턴과 관련된 코드를 작성 중이며 명확한 설명을 원합니다. 나는 슈퍼 매니저, 메인 매니저 및 일반 매니저가 있고 그들은 맨 위에 슈퍼 매니저와 함께 내림차순 계층에 있습니다.복합 패턴 구현

나는 슈퍼 매니저가 메인 매니저에게 돈을주고 메인 매니저가 정규 관리자에게 돈을 줄 수 있기를 바랄 것이다. 내가 가지고있는 문제는 주인공이 슈퍼 매니저에게 돈을 줄 수 있기를 원하지 않는다는 것과, instanceof을 사용하고 싶지 않다는 것입니다. 왜냐하면 그것이 복합 패턴의 목적에 어긋나 기 때문입니다.

My Main Manager 및 Ordinary Manager는 gradeManagers라는 추상 클래스를 확장하지만 Super Manager에는 gradeManagers 유형의 구성 요소를 추가 할 수있는 배열 목록이 있습니다.

답변

5

계층 구조가 복합 패턴에 가장 적합하다고 생각하지 않습니다. 복합 패턴은 개별 객체와 동일한 방식으로 객체 컬렉션을 처리 할 수 ​​있도록합니다. (때로는 파트를 함께 볼트로 생각하십시오. 때때로 다른 파트/하위 어셈블리와 함께 볼트로 결합 할 수있는 단일 파트로 하위 어셈블리를 생각하고 싶을 수도 있습니다. 하위 어셈블리는 복합 재료입니다.) 당신이 무엇인지 이해한다면 하려고하면 다른 Manager로 취급하려는 Manager 객체 모음이 없습니다.

그럼에도 불구하고 Composite를 사용하든 관계없이 계층 구조를 따라갈 때 증가하는 속성 (depth)을 추가하는 것이 좋습니다. 그런 다음 이것을 사용하여 비즈니스 규칙을 구현할 수 있습니다. Manager는 다른 Manager와 동일하거나 더 높은 수준의 돈만 제공 할 수 있습니다. 이를 통해 객체 클래스의 개념을 피하는 방식으로 코딩 할 수 있습니다.

+0

내 코드의 인스턴스를 포함하고 싶지 않으므로 고맙습니다. –

+0

@Jackwelch'instanceof'는 코딩 스타일이 좋지 않다고 신호를 표시하지만, 그것을 피하기 위해 농구를 뛰어 넘는 것이 좋지 않습니다. 둘 중 하나만 수행해야하는 경우 다른 곳에서 수행해야하는 리펙토링이있을 수 있습니다. – kba

+0

+1 좋은 답변 @Ted – Nilesh

1

Ted Hopp이 이미 언급했듯이이 패턴은 복합 패턴을 사용할 때와 같이 들리지 않습니다. 이것은 polymorphism의 경우와 같습니다.

복합 패턴은 항목 그룹을 하나로 처리하려는 경우에 사용해야합니다. 삼각형, 사각형 등 화면에 도형을 배치 할 수있는 그리기 프로그램을 생각해보십시오. 이제 이러한 도형의 배경색을 변경할 수있는 기능을 고려해보십시오. 여러 모양의 배경색을 변경하고자한다면,이

interface Shape { 
    public void setBackgroundColor(Color c); 
} 

처럼 그리고 실제 구현 코드에서 뭔가를하고 싶어 :

for (Shape s : selectedShapes) 
    s.setBackgroundColor(c); 

을 대신 코드에서이 일을, 복합 패턴을 사용할 수 있습니다. 이렇게하면 구현 코드가 편집하려는 "모양"이 실제로 여러 모양이므로 응용 프로그램에서 다른 모양으로 처리 할 수 ​​있다는 사실을 완전히 알 수 없습니다.

class CompositeShape implements Shape 
{ 
    public void setBackgroundColor(Color c); 
    for (Shape s : Shapes) 
     s.setBackgroundColor(c); 
} 

class TriangleShape implements Shape { ... } 
class SquareShape implements Shape { ... } 
0

@Ted Hopp의 답변을 연장하고 깊이 대신에 등급을 사용할 수 있다고 제안합니다. 이것은 당신이 작업하고있는 도메인에 더 가깝습니다. 관리자에게 채점 관리자가 있다는 것을 이미 지적 했으므로 이는 훌륭한 해결책 일 수 있습니다.

희망이 있습니다.