CS/개념정리

Composite Pattern

bell22 2023. 3. 1. 21:53

요즘 젊은이들은 본디로 생축한다

 

조금 예전에 공부했던 디자인 패턴인데, 다시 복습하면서 정리해보았다

디자인 패턴도 찾아보며 개발했던 열정 어디갔니 🥹


 

Composite 뜻

OOP에서 컴포지트는 하나 이상의 유사한 객체를 구성으로 설계된 객체로 모두 유사한 기능을 가짐

객체 그룹을 조작하는 것 처럼 단일 객체를 조작할 수 있음

 

Composite Pattern

클라이언트가 복합 객체/단일 객체를 동일하게 취급하는 것을 목적으로 함

트리 구조로 작성, 전체-부분 관계 표현

  • 트리구조를 다룰 때, 개발자는 리프노드와 브랜치 구별해야함
  • 복잡하게 만들지 않기 → 인터페이스 활용해서 작성한다던가

  • Client 클래스는 Leaf와 Composite 클래스에 직접 참조 하지 마세욥 🙅‍♀️🙅‍♀️
  • 인터페이스인 Component만 참조하기
  • Leaf는 Component 인터페이스 구현
  • Composite 는 Component 객체 자식들을 유지하고, operation() 같은 요청을 통해 자식들에게 전달

정리하자면

  • Leaf: Component 인터페이스 구현, 구체 클래스
  • Component: 모든 component를 위한 추상화 개념, 인터페이스
  • Composite: Component 인터페이스 구현, 구현되는 leaf/composite 들을 가지고 관리하는 메소드 구현.
    • 인터페이스에 작성된 메소드는 자식에게 위임하는 처리를 해줌

 

그럼 이렇게 구현 가능

Client는 → Coposite1에만 요청을 보내면 다 알아서 주루룩 되는 형태

Component 인터페이스를 구현한 객체들은 자신의 모든 자식 요소에게 전달

 

그럼 이걸 뭐에다가 쓰냐면

 

public class ImportCommand : CompositeCommand
{
    public ImportInvoicesCommand()
    {
        AddChild(new PlayVideoCommand());
        AddChild(new InsertToDatabaseCommand());
        AddChild(new RequestToCameraCommand());
    }
}

 

이런 식으로 클라이언트에서 수행할 작업들을 등록을 해 놓고

 

public void ImportInvoices()
{
    var command = new ImportInvoicesCommand();
        
    command.Execute();
}

 

Execute() 함수만 호출해주면, 위에서 AddChild로 등록해준 작업들이 실행되도록 활용할 수 있다

비슷한 작업인데 여러 건 진행할 때 사용하면 좋은 듯 하다.