Open KUMA93 opened 1 year ago
[Java][디자인 패턴] 9. 복합체 패턴 (Composite Pattern)
복합체 패턴은 객체 간의 계층적 구조화를 통해 객체를 확장하는 패턴이다. 복합체는 재귀적으로 결합된 계층화된 트리 구조의 객체이다.
!https://blog.kakaocdn.net/dn/bllXnv/btrvcHDNz4J/N5uyJro0ITwOWbVkJPNcXK/img.png
복합체 패턴 구성요소
!https://blog.kakaocdn.net/dn/dJR9ny/btrvhm6f1Gd/XwYsTaxOpoyWpmJbNnLWv0/img.png
복합체 패턴 예제 코드 구조
복합체 패턴 구조에 해당하는 예시 코드로는, 도형의 색을 변경하고 옮기고 표현하는 공통적인 동작을 수행하는 Shape 인터페이스를 만들고, 각 도형들을 그룹화해서 관리할 수 있는 ShapeComposite 클래스를 통해 객체를 관리해보려 한다.
1. Shape 인터페이스
publicinterfaceShape {voiddraw(String fillColor);voidmove(Integer x, Integer y);voidprint();default StringgetDefaultColor() {return "BLUE"; }}
2. Shape 인터페이스를 구현하고 있는 Circle, Triangle 클래스
publicclassCircleimplementsShape {privatefinal Point point;private String color;publicCircle() {this.point =new Point();this.color = getDefaultColor(); } @Overridepublicvoiddraw(String fillColor) {this.color = fillColor; } @Overridepublicvoidmove(Integer x, Integer y) { point.move(x, y); } @Overridepublicvoidprint() { System.out.println("[Circle][" + color + "] " + point.toString()); }}
publicclassTriangleimplementsShape {privatefinal Point point;private String color;publicTriangle() {this.point =new Point();this.color = getDefaultColor(); } @Overridepublicvoiddraw(String fillColor) {this.color = fillColor; } @Overridepublicvoidmove(Integer x, Integer y) { point.move(x, y); } @Overridepublicvoidprint() { System.out.println("[Triangle][" + color + "] " + point.toString()); }}
3. Shape의 좌표 값을 가지고 있는 Point 클래스
publicclassPoint {private Integer x;private Integer y;publicPoint(Integer x, Integer y) {this.x = x;this.y = y; }publicPoint() {this.x = 0;this.y = 0; }publicvoidmove(Integer x, Integer y) {this.x =this.x + x;this.y =this.y + y; }public IntegergetX() {return x; }public IntegergetY() {return y; } @Overridepublic StringtoString() {return "Point{" + "x=" + x + ", y=" + y + '}'; }}
4. Shape들을 그룹화해서 한꺼번에 관리하는 ShapeComposite 클래스
publicclassShapeCompositeimplementsShape {privatefinal List<Shape> shapeList =new ArrayList<>(); @Overridepublicvoiddraw(String fillColor) {for (Shape shape : shapeList) { shape.draw(fillColor); } } @Overridepublicvoidmove(Integer x, Integer y) {for (Shape shape : shapeList) { shape.move(x, y); } } @Overridepublicvoidprint() {for (Shape shape : shapeList) { shape.print(); } }publicvoidadd(Shape shape) { shapeList.add(shape); }publicvoidremove(Shape shape) { shapeList.remove(shape); }publicvoidclear() { System.out.println("clear"); shapeList.clear(); }}
5. ShapeComposite 클래스의 테스트 코드
classShapeCompositeTest { @Test @DisplayName("도형을 그리고 한꺼번에 옮긴다")voiddrawShape() { Shape triangle =new Triangle(); Shape triangle2 =new Triangle(); Shape circle =new Circle(); ShapeComposite shapeComposite =new ShapeComposite(); shapeComposite.add(triangle); shapeComposite.add(triangle2); shapeComposite.add(circle); shapeComposite.print(); shapeComposite.draw("RED"); shapeComposite.print(); shapeComposite.move(1, 1); shapeComposite.print(); shapeComposite.move(2, -3); shapeComposite.print(); }}
결과 값
[Triangle][BLUE] Point{x=0, y=0}[Triangle][BLUE] Point{x=0, y=0}[Circle][BLUE] Point{x=0, y=0}[Triangle][RED] Point{x=0, y=0}[Triangle][RED] Point{x=0, y=0}[Circle][RED] Point{x=0, y=0}[Triangle][RED] Point{x=1, y=1}[Triangle][RED] Point{x=1, y=1}[Circle][RED] Point{x=1, y=1}[Triangle][RED] Point{x=3, y=-2}[Triangle][RED] Point{x=3, y=-2}[Circle][RED] Point{x=3, y=-2}
복합체 패턴이란 도대체 무엇일까요? 복합체 패턴은 객체들을 트리 구조들로 구성한 후, 이러한 구조들과 개별 객체들처럼 작업할 수 있도록 하는 구조 패턴입니다.
오 잘 알고 계시네요. 그렇다면 언제 사용하는게 좋을까요? 핵심 모델이 트리로 표현될 수 있을 때 사용해야 합니다. 복합체 패턴에 의해 정의된 모든 요소들은 공통 인터페이스를 공유하기 때문에 단순 요소들과 복합 요소들을 모두 균일하게 처리하도록 하고 싶을 때 사용하는 것이 좋습니다.