본문 바로가기

OOP44

Composite 핵심 의도 클라이언트에서 개별 객체와 복합 객체를 똑같은 방법으로 다룰 수 있다. 개별 객체와 복합 객체는 서로 포함 관계인데, 객체를 트리구조로 구성해서 부분-전체 계층 구조를 구현한다. 적용 상황 계층 구조가 있는 자료구조의 아이템에 대해 공통된 인터페이스로 접근할 때 사용한다. 컴포지트 패턴을 사용하면 클라이언트에게는 계층 구조가 보이지 않기 때문에 클라이언트의 사용 코드가 매우 단순해진다는 장점이 있다. 솔루션의 구조와 각 요소의 역할 객체에게 책임을 분할하기 개별 객체(leaf)와 복합 객체(composite)가 존재하는 상황. 클라이언트는 개별 객체와 복합 객체를 동일한 방법으로 사용하고자 하므로 개별 객체와 복합 객체를 공통으로 묶는 인터페이스인 Component를 둔다. Component는.. 2023. 2. 24.
Iterator 핵심 의도 컬렉션의 구현 방법을 노출하지 않으면서 집합체 내의 모든 항목에 접근하는 방법을 제공한다. 집합체를 사용하는 클라이언트는 집합체의 저장 방식을 몰라도 반복 작업을 할 수 있고, 집합체 역시 구체적인 저장방식을 공개하지 않아도 되므로 더 유연하고 다형적인 코드를 작성할 수 있다. 적용 상황 서로 다른 타입의 컬렉션에 대해 동일한 인터페이스로 모든 항목에 접근하고 싶을 때 사용한다. 예를 들어 배열이나 ArrayList를 가진 객체를 인터페이스로 한번 감싸서 동일한 인터페이스로 모든 항목에 접근할 수 있다. 자바에서 제공하는 Iterator 인터페이스를 사용하면 편리하다. 클라이언트 사용 객체가 자신이 가진 컬렉션에 해당하는 Iterator 구현체를 반환하는 메소드를 두면 된다. 배열은 Itera.. 2023. 2. 24.
Template Method 핵심 의도 알고리즘의 구조는 유지하면서 알고리즘의 특정 단계를 서브클래스에서 구현하거나 재정의하는 방법이다. 적용 상황 코드의 유사성이 높은데 코드의 일부분이 다른 경우, 템플릿 메소드로 공통인 부분은 상위로 올리고 다른 부분만 서브 클래스에서 구현하게 한다. 코드가 그대로 중복되는 것을 막을 수 있고, 공통 인터페이스를 사용해 메시지를 요청할 수 있다. 프레임워크를 제공할 때 자주 사용한다. 프레임워크는 사용자로 하여금 작업 흐름을 강제하는데, 템플릿 메소드에서 알고리즘 구조를 제어할 수 있다. 그러면서도 알고리즘의 각 단계는 사용자가 마음대로 지정할 수 있다. 솔루션의 구조와 각 요소의 역할 객체에게 책임을 분할하기 일련의 알고리즘을 정의한 메소드인 템플릿 메소드를 가진 상위 클래스가 필요하다. 템플.. 2023. 2. 24.
Facade 핵심 의도 서브 시스템에 있는 일련의 인터페이스들을 통합 인터페이스로 묶어준다. 사용에 필요한 서브 시스템 클래스만 이해하면 되고, 라이브러리 형태로 코드를 제공할 때 파사드에 포함된 클래스만 제공할 수 있으므로 코드 양이 줄어든다. 적용 상황 서브 시스템의 다양한 인터페이스들을 편리하게 사용하기 위해 단순화할 때 필요하다. 예를 들어 홈 씨어터를 만들어 영화를 본다면, 불을 켜고 팝콘을 튀기고 프로젝트를 켜는 등의 일련의 동작들을 ‘영화를 본다’는 하나의 인터페이스로 통합할 수 있다. Decoration vs Adapter vs Facade Decoration : 인터페이스는 변경하지 않고 책임만 추가하는 역할 Adapter : 인터페이스를 클라이언트에서 원하는 인터페이스로 바꾸는 역할 Facade :.. 2023. 2. 24.
Adapter 핵심 의도 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인스턴스로 변환한다. 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와준다. 적용 상황 클라이언트가 기존에 사용하고 있는 인터페이스가 있는데, 호환되지 않는 새로운 인터페이스를 기존 인터페이스(타깃)으로 사용하고 싶을 때 어댑터 패턴을 사용한다. 솔루션의 구조와 각 요소의 역할 위의 그림은 객체 어댑터의 구조. 다중 상속이 가능한 언어로 클래스 어댑터도 만들 수 있다. 타깃과 어댑티를 상속하여 어댑터를 만든다. 객체에게 책임을 분할하기 우선 클라이언트가 기존에 사용하고 있는 인터페이스가 Target이다. 그리고 새롭게 사용하려고 하는 인터페이스가 Adaptee이다. 클라이언트가 Adaptee를 Target 타입으로.. 2023. 2. 24.
Command 핵심 의도 요청 내역을 객체로 캡슐화해서 객체를 서로 다른 요청 내역에 따라 매개변수화하거나 메모리에 보관할 수 있다. 적용 상황 요청을 큐에 저장하거나 로그로 기록하거나 작업 취소 기능을 사용할 수 있다. 재실행이나 우선순위에 따라 명령어를 실행하거나 배치 실행도 가능하다. 솔루션의 구조와 각 요소의 역할 객체에게 책임을 분할하기 요청을 보내는 책임과 그 요청을 처리하는 책임은 각각 Client와 Receiver에게 있다. 예를 들어 사용자가 선풍기를 켜고 싶다면 요청을 보내는 책임은 사용자에게, 선풍기를 켜는 요청을 처리하는 책임은 선풍기에게 있다. 그리고 사용자의 요청들을 중간에서 기록하고 전달하는 책임은 Invoker가 한다. 사용자가 선풍기 뿐만 아니라 부엌 불, 라디오 등을 키거나 끄고 싶다면.. 2023. 2. 24.