책너두 (헤드 퍼스트 디자인 패턴) 29일차 (~398p)

요약

  • 반복자 패턴과 컴포지트 패턴
    • 반복자와 컬렉션
    • 리팩터링 준비하기
    • 컴포지트 패턴의 정의

메모

반복자와 컬렉션

  • 컬렉션과 반복자를 사용하면 모든 컬렉션 객체에서 자신을 대상으로 하는 반복자를 리턴할 줄 안다는 장점을 활용할 수 있음.
    • ArrayList의 iterator() 메소드를 호출하면 ArrayList용 구상 Iterator 클래스가 리턴됨.
    • 구상 클래스의 구현은 신경쓰지 않고, Iterator 인터페이스만 사용하면 됨.
  • HashMap은 반복자를 간접적으로 지원하는 클래스임.
    • 2개의 객체 모듬이 들어있음. → keys, values
    • 값들을 대상으로 반복작업을 하고 싶다면, HashMap 의 values 를 가져온 다음에 반복자를 받아와야 함.
  • 만약, 메뉴 안에 서브 메뉴를 지원해달라고 한다면?
    • ex) 디저트 메뉴 → DinnerMenu 컬렉션 원소로 넣으면 좋겠지만, 현재 구현 상황에서는 형식이 달라서 그럴 수 없음.

리팩터링 준비하기

  • 현재 디자인에서는 서브메뉴를 기존 메뉴에 추가할 수 없음.
    • 메뉴, 서브메뉴, 메뉴 항목을 모두 넣을 수 있는 트리 형태의 구조가 필요함.
    • 각 메뉴에 있는 모든 항목을 대상으로 특정 작업을 할 수 있는 방법을 제공해야 함.
      • 이 방법은 적어도 지금 사용중인 반복자만큼 편해야 함.
    • 더 유연한 방법으로 아이템을 대상으로 반복 작업을 할 수 있어야 함.
      • ex) 객체 마을 식당 메뉴 대상, 디저트 메뉴 대상, 디저트 서브메뉴 대상

컴포지트 패턴의 정의

  • 메뉴 관리는 반복자 패턴만으로 처리하기 어렵기에 메뉴 관리에 도움이 되는 컴포지트 패턴을 쓰기로 결정함.
📍 컴포지트 패턴(Composite Pattern) : 객체를 트리구조로 구성해서 부분-전체 계층구조를 구현함. 컴포지트 패턴을 사용하면 클라이언트에서 개별 객체와 복합 객체를 똑같은 방법으로 다룰 수 있음.
  • 이 패턴을 사용하면 중첩되어 있는 메뉴 그룹과 항목을 똑같은 구조 내에서 처리할 수 있음.
    • 개별 객체와, 복합 객체에 또같은 방식을 적용할 수 있음.
    • ex) 메뉴, 서브메뉴, 서브서브메뉴로 구성된 트리구조가 있다고 하면 각각이 모두 복합 객체가 될 수 있음.

  • Client 는 Component 인터페이스를 사용해서 복합 객체내의 객체들을 조작할 수 있음.
  • Component는 복합 객체 내에 들어있는 모든 객체의 인터페이스를 정의함.
    • 복합 노드와 잎에 관한 메소드까지 정의함.
  • Leaf 에는 add, remove, getChild 같은 메소드를 쓰지 않음.
    • Leaf 는 그 안에 들어있는 원소 행동을 정의함.
    • Composite 에서 지원하는 기능을 구현하면 됨.
  • Composite는 자식이 있는 구성 요소의 행동을 정의하고 자식 구성 요소를 저장함.
    • Composite 에서 Leaf와 관련된 기능도 구현해야 함.
  • 복합 객체(Composite)에는 구성 요소(Component)가 들어 있음.
    • 구성 요소는 두 종류로 나눌 수 있음.
      • 복합 객체
    • 실제로 재귀 구조임.
      • 복합 객체에는 자식들이 있으며, 그 자식들은 복합 객체일 수도 있고, 아니면 그냥 잎일 수도 있음.
      • 복합 객체를 따라서 가지가 연결되다가 마지막에 잎으로 끝나는 트리구조임.

댓글

Designed by JB FACTORY