디자인 패턴 - 컴포지트 패턴 (Composite Pattern)

  • Composite 란 영어사전상 "복합체" 라는 뜻.
  • 소프트웨어적으로는 하나 이상의 유사한 객체를 구성으로 설계된 객체로서, 모두 유사한 기능을 나타내는 것을 뜻한다.
  • 즉, 객체 그룹을 조작하는 것처럼 단일 객체를 조작할 수 있음.

  • 컴포지트 패턴은 클라이언트가 복합 객체나 단일 객체를 동일하게 취급하는 것을 목적으로 함.
  • 이 때, 컴포지트의 의도는 "트리 구조"로 작성하여, 전체-부분(whole-part) 관계를 표현하는 것이다.
  • 즉, 전체-부분 관계를 효율적으로 정의할 때 컴포지트 패턴은 유용하다.

  • Composite 패턴에는 3가지로 구조가 나뉘어져있다.
    1. Component
      • 구체적인 부분
      • Leaf 클래스와 Composite 클래스의 공통 인터페이스임
    2. Leaf
      • 구체적인 부분 클래스
      • Composite 객체의 부품
    3. Composite
      • 전체 클래스.
      • 여러개의 Component를 갖도록 정의한다.
      • 그래서 여러개의 Leaf, 여러개의 Composite를 부분으로 가질수도 있다.

예시

  • 강아지와 고양이는 동물이다.
  • 강아지그룹, 고양이그룹에 각각 2마리, 3마리 넣는다.
  • 두 그룹을 동물원에 넣는다.
  • 동물원 내의 동물들을 모두 speak 하게 만들면?

Component: IAnimal.java

// Component 역할
interface IAnimal {
    public void speak();
}

Leaf: Cat.java

public class Cat implements IAnimal{
    @Override
    public void speak() {
        System.out.println("야옹");
    }
}

Leaf: Dog.java

public class Dog implements IAnimal{
    @Override
    public void speak() {
        System.out.println("멍멍");
    }
}

Composite: AnimalGroup.java

// Composite 역할
public class AnimalGroup implements IAnimal {

    private List<IAnimal> animalGroup = new ArrayList<IAnimal>();

    public void speak() {
        for (IAnimal animal : animalGroup) {
            animal.speak();
        }
    }

    public void add(IAnimal animal) {
        animalGroup.add(animal);
    }

    public void remove(IAnimal animal) {
        animalGroup.remove(animal);
    }
}

Client: Main.java

public class Main {
    public static void main(String[] args) {

        // 강아지그룹, 고양이그룹 생성
        AnimalGroup dog_group = new AnimalGroup();
        AnimalGroup cat_group = new AnimalGroup();

        // 강아지 2마리, 고양이 3마리 만들어서 각 그룹에 넣기
        Dog dog1 = new Dog();
        Dog dog2 = new Dog();

        Cat cat1 = new Cat();
        Cat cat2 = new Cat();
        Cat cat3 = new Cat();

        dog_group.add(dog1);
        dog_group.add(dog2);

        cat_group.add(cat1);
        cat_group.add(cat2);
        cat_group.add(cat3);

        // 강아지그룹과 고양이그룹을 동물원이라는 그룹안에 넣겠음
        AnimalGroup zoo = new AnimalGroup();
        zoo.add(dog_group);
        zoo.add(cat_group);

        // 동물원의 모든 동물들을 speak 해보겠음
        zoo.speak();
    }
}

결과는 다음과 같이 나온다.

멍멍
멍멍
야옹
야옹
야옹

'TIL' 카테고리의 다른 글

SVN vs Git  (1) 2022.12.11
JPA fetchType (EAGER, LAZY)  (0) 2022.12.06
디자인패턴 - 프록시 패턴 (Proxy Pattern)  (0) 2022.11.08
프로그래머스 SQL 고득점 Kit 도장깨기  (0) 2022.10.29
URI, URL, URN 차이  (0) 2022.10.25

+ Recent posts