wannabeGPT / CS_study

0 stars 0 forks source link

복합체 패턴 (Composite Pattern) #69

Open KUMA93 opened 1 year ago

KUMA93 commented 1 year ago
bradbrad97 commented 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}

복합체 패턴의 장점과 단점

장점

단점

KUMA93 commented 1 year ago
  1. 복합체 패턴이란 도대체 무엇일까요? 복합체 패턴은 객체들을 트리 구조들로 구성한 후, 이러한 구조들과 개별 객체들처럼 작업할 수 있도록 하는 구조 패턴입니다.

  2. 오 잘 알고 계시네요. 그렇다면 언제 사용하는게 좋을까요? 핵심 모델이 트리로 표현될 수 있을 때 사용해야 합니다. 복합체 패턴에 의해 정의된 모든 요소들은 공통 인터페이스를 공유하기 때문에 단순 요소들과 복합 요소들을 모두 균일하게 처리하도록 하고 싶을 때 사용하는 것이 좋습니다.

anuu0916 commented 1 year ago

https://inpa.tistory.com/entry/GOF-%F0%9F%92%A0-%EB%B3%B5%ED%95%A9%EC%B2%B4Composite-%ED%8C%A8%ED%84%B4-%EC%99%84%EB%B2%BD-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%95%98%EA%B8%B0#%ED%8C%8C%EC%9D%BC_%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC_%EC%8B%9C%EC%8A%A4%ED%85%9C_%EA%B5%AC%ED%98%84