행동 패턴(Behavioral Pattern)이란?

삼각김밥·2023년 9월 4일

행동 패턴(Behavioral Pattern)

행동패턴이란?

  • 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴.
  • 한 객체가 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하며 객체 사이의 결합도 최소화에 중점을 둔다.
  • 패턴을 주로 클래스에 적용하는지 아니면 객체에 적용하는지에 따라 구분되는 패턴이다.

행동패턴의 종류

  1. 책임연쇄 패턴(Chain of Responsibility)
    : 책임들이 연결되어 있어 내가 책임을 못 질 것 같으면 다음 책임자에게 자동으로 넘어가는 패턴.

  2. 커맨드 패턴(Command Pattern)
    : 명령어를 각각 구현하는 것보다 하나의 추상 클래스에 메서드를 하나 만들고 각 명령이 들어오면 그에 맞는 서브 클래스가
    선택되어 실행되는 패턴.

  3. 인터프리터 패턴(Interpreter Pattern)
    : 문법 규칙을 클래스화한 구조를 갖는 SQL 언어나 통신 프로토콜 같은 것을 개발할 때 사용하는 패턴.

  4. 반복자 패턴(Iterator Pattern)
    : 반복이 필요한 자료구조를 모두 동일한 인터페이스를 통해 접근할 수 있도록 메서드를 이요해 자료구조를
    활용할 수 있도록 하는 패턴.

  5. 옵저버 패턴(Observer Pattern)
    : 어떤 클래스에 변화가 일어났을 때, 다른 클래스에 통보하는 패턴.

  6. 전략 패턴(Strategy Pattern)
    : 알고리즘 군을 정의하고 각각 하나의 클래스로 캡슐화한 다음, 필요할 때 서로 교환해서 사용하는 패턴.

  7. 템플릿 메서드 패턴(Template Method Pattern)
    : 상위 클래스에서 추상적으로 표현하고, 그 구체적인 내용은 하위 클래스에서 결정하는 패턴.

  8. 방문자 패턴(Visitor Pattern)
    : 각 클래스의 데이터 구조로부터 처리 기능을 분리하여 별도의 visitor 클래스로 만들어두고
    해당 클래스의 메서드가 각 클래스를 돌아다니면서 특정 작업을 수행하는 패턴.

  9. 중재자 패턴(Mediator Pattern)
    : 클래스간의 복잡한 상호작용을 캡슐화하여 중간의 클래스에 위임해서 처리한다.

  10. 상태 패턴(State Pattern)
    : 동일한 동작을 객체의 상태에 따라 다르게 처리할 때 사용하는 패턴.

  11. 메멘토 패턴(Memento Pattern)
    : 클래스 설계 관점에서 특정 시점의 객체의 정보를 저장하는 패턴.

책임연쇄 패턴(Chain of Responsibility)

책임연쇄 패턴이란?

  • 클라이언트 요청을 처리할 수 있는 처리객체를 집합(Chain)으로 만들어 부여하여 결합을 느슨하게 하기위해 만들어진 디자인 패턴.
  • 굉장히 많이 쓰이는 패턴 중 하나로 여러 개의 객체 중에서 어떤 것이 요구를 처리할 수 있는 지 사전에 알 수 없을 때 사용.
  • 요청 처리가 들어오게 되면 그것을 수신하는 객체가 자신이 처리할 수 없는 경우에는 다음 객체에게 문제를 넘김으로써
    최종적으로 요청을 처리할 수 있는 객체의 의해 처리가 가능하도록 하는 패턴.

책임연쇄 패턴의 구조

Chain of Responsibility Structure

책임연쇄 패턴의 장점

  • 결합도를 낮추며, 요청의 발신자와 수신자를 분리시킬 수 있다.
  • 클라이언트는 처리객체의 집합 내부의 구조를 알 필요가 없다.
  • 요청의 처리 순서를 제어할 수 있다.
  • 집합 내의 처리 순서를 변경하거나 처리객체를 추가 또는 삭제할 수 있어 유연성이 향상된다.
  • 새로운 요청에 대한 처리객체 생성이 매우 편리하다.

책임연쇄 패턴의 단점

  • 충분한 디버깅을 거치지 않았을 경우 집합 내부에서 순환참조가 발생할 수 있다.
  • 디버깅 및 테스트가 쉽지 않다.

책임연쇄 패턴의 적용

  • 다양한 방식으로 다양한 종류의 요청들을 처리할 것으로 예상되지만, 정확한 요청 유형들과 순서들을 미리 알 수 없는 경우에 사용.
  • 특정 순서로 여러 핸들러를 실행해야 할 때 사용.
  • 핸들러들의 집합과 그들의 순서가 동적으로 변경되어야 할 때 사용.

커맨드 패턴(Command Pattern)

커맨드 패턴이란?

  • 요청에 따라야하는 기능들을 캡슐화한 객체에 정리하여 실행할 수 있게 하는 패턴.
  • 요청에 따르는 기능들이 다양하고 변경 및 추가 삭제가 많은 경우 요청이 발생되는 클래스를 변경하지 않고 수정할 때 유용.

커맨드 패턴의 구조

Command Pattern Structure

  • Invoker
    : 해당 요청에 따르는 기능의 실행을 요청하는 호출자 클래스.

  • Command
    : 실행될 기능에 대한 인터페이스. 실행되는 기능들을 종합하는 execute를 선언한다.

  • ConcreteCommand
    : 실제로 실행되는 기능을 구현한다.

  • Receiver
    : ConcreteCommand의 execute를 구현하는 클래스. 기능을 실행하기 위해 필요한 수신자 클래스.

  • Client
    : 요청을 전달하는 클라이언트

커맨드 패턴의 적용

  • 객체를 매개변수화하려는 경우 커맨드 패턴을 사용.
  • 병렬로 여러 스레드에서 실행이 되어야 하는 경우에 사용.
  • 특정 명령에 따른 일련의 작업을 반복적으로 수행해야 하는 경우에 사용.
  • 작업들의 실행을 예약하거나, 대기열에 넣거나, 원격으로 실행하려는 경우에 사용.
  • 되돌릴 수 있는 작업을 구현하려고 할 때 사용.

커맨드 패턴의 장점

  • 기존 코드를 변경하지 않고 새 명령을 추가할 수 있어 코드 확장이 수월.
  • 호출자와 수신자의 결합도를 낮출 수 있음.
  • OCP
  • SRP
  • 간단한 커맨드들의 집합을 복잡한 커맨드로 조합할 수 있음.

커맨드 패턴의 단점

  • 호출자와 수신자 사이에 완전히 새로운 계층을 도입하기 때문에 코드가 더 복잡해짐.

인터프리터 패턴(Interpreter Pattern)

인터프리터 패턴이란?

  • 언어 문법이나 표현을 평가할 수 있는 방법을 제공한다.
  • 특정 컨텍스트를 해석하도록 지시하는 표현 인터페이스를 구현하는 것을 포함한다.
  • SQL 구문 분석, 기호 처리 엔진 등에서 사용된다.

인터프리터 패턴의 구조

Interpreter Pattern Structure

  • AbstractExpression
    : interpret()을 정의.

  • TerminalExpression
    : interpret()을 구현.

  • NonTerminalExpression
    : Non-Terminal의 interpret()을 구현.

  • Context
    : String 표현식이여야 하며 인터프리터에 보내는 정보.

  • Client
    : interpret()을 호출.

반복자 패턴(Iterator Pattern)

반복자 패턴이란?

  • 어떠한 객체의 집합을 순서대로 명령을 처리할 수 있게 해주는 디자인 패턴.
  • 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체안에 들어있는 모든 항목에 접근할 수 있게 해주는 패턴.

반복자 패턴의 구조

Iterator Pattern Structure

  • Iterator
    : 순서대로 객체를 검색하는 인터페이스를 정한다.

  • ConcreteIterator
    : Iterator에서의 인터페이스를 구현한다.

  • IterableCollection
    : Iterator의 역할을 만드는 인터페이스를 정한다.

  • ConcreteCollection
    : IterableCollection의 인터페이스를 구현한다.

반복자 패턴의 적용

  • 컬렉션이 내부에 복잡한 데이터 구조가 있지만 이 구조의 복잡성을 보안, 편의상의 이유로 클라이언트에게 숨기고 싶을 때 사용
  • 순회 코드의 중복을 줄일 때 사용
  • 코드가 다른 데이터 구조들을 순회할 때 사용. 혹은 데이터 구조의 유형을 미리 알 수 없을 때 사용.

옵저버 패턴(Observer Pattern)

옵저버 패턴이란?

  • 객체의 상태 변화를 관찰하는 관찰자 객체를 생성하여 사용하는 패턴.
  • 객체의 변화가 발생하면 그에 따르는 종속객체들이 자동으로 변화가 통지되어 그에 따른 명령을 수행하도록 하는
    일대다의 의존성을 정의.
  • 데이터의 변경이 발생했을 경우 상대 클래스나 객체에 의존하지 않으면서 데이터 변경을 통보하고자 할 때 유용.

옵저버 패턴의 구조

Observer Pattern Structure

  • Subscriber(Observer)
    : 데이터의 변경을 통보 받는 인터페이스. Publisher에서 Subscriber의 update 메서드를 호출함으로써
    Publisher의 데이터 변경을 ConcreteSubscribers에게 통보한다.

  • Publisher(Subject)
    : ConcreteSubscribers를 관리.

  • ConcreteSubscribers(ConcreteObserver)
    : Publisher의 변경을 통보받는 클래스.

옵저버 패턴의 적용

  • 한 객체의 상태가 변경되어 다른 객체들을 변경해야 할 필요성이 생겼을 때, 그리고 실제 객체 집합들을 미리 알 수 없거나
    이러한 집합들이 동적으로 변경될 때 사용.
  • 일부 객체들이 제한된 시간 동안 또는 특정 경우에만 다른 객체들을 관찰해야 할 때 사용.

전략 패턴(Strategy Pattern)

전략 패턴이란?

  • 행위를 클래스로 캡슐화해 동적으로 행위를 자유롭게 바꿀 수 있게 해주는 패턴.
  • 같은 문제를 해결하는 여러 알고리즘이 클래스별로 캡슐화되어 있고 이들이 필요할 때 교체할 수 있도록 함으로써
    동일한 문제를 다른 알고리즘으로 해결할 수 있게 하는 디자인 패턴.
  • 전략을 쉽게 바꿀 수 있도록 해주는 디자인 패턴.

전략이란?

  • 어떤 목적을 달성하기 위해 일을 수행하는 방식, 비즈니스 규칙, 문제를 해결하는 알고리즘 등.

전략 패턴의 구조

Strategy Pattern Structure

  • Strategy
    : 인터페이스나 추상 클래스로 외부에서 동일한 방식으로 알고리즘을 호출하는 방법을 명시.

  • ConcreteStrategy
    : Strategy에서 명시한 알고리즘을 실제로 구현한 클래스.

  • Context
    : 전략 패턴을 이용하는 역할. 필요에 따라 동적으로 구체적인 전략을 바꿀 수 있도록 setter 메서드 제공.

전략 패턴의 적용

  • 객체 내에서 한 알고리즘의 다양한 변형들을 사용하고 싶을 때, 그리고 런타임 중에 한 알고리즘에서 다른 알고리즘으로 전환하고 싶을 때 사용.
  • 일부 행동을 실행하는 방식에서만 차이가 있는 유사한 클래스들이 많은 경우에 사용.
  • 같은 알고리즘의 다른 변형들 사이를 전환하는 거대한 조건문이 있을 경우 사용.

템플릿 메서드 패턴(Template Method Pattern)

템플릿 메서드 패턴이란?

  • 상위 클래스에서 처리의 흐름을 제어하며, 하위 클래스에서 처리 내용을 구체화하는 디자인 패턴.
  • 공통되는 사항을 상위 추상 클래스에서 구현하며, 각 객체마다 다른 부분은 하위 클래스에서 구현.
  • 상속을 통한 확장 개발 방법으로 코드의 중복을 줄이고 리팩토링에 유리하여 가장 많이 사용되는 패턴 중 하나.

템플릿 메서드 패턴의 구조

Template Method Pattern Structure

  • Abstract Class
    : 추상 클래스로 templateMethod를 정의한다.

  • Concrete Class
    : 부모 클래스에서 abstract로 정의된 templateMethod를 구현한다.

템플릿 메서드 패턴의 적용

  • 클라이언트들이 알고리즘의 특정 단계들만 확장할 수 있도록 하고 싶을 때, 그러나 전체 알고리즘이나 알고리즘
    구조는 확장하지 못하도록 하려고 할 때 사용.
  • 약간의 차이가 있지만 거의 같은 알고리즘들을 포함하는 여러 클래스가 있을 때 사용.

방문자 패턴(Visitor Pattern)

방문자 패턴이란?

  • 실제 로직을 가지고 있는 객체(Visitor)가 로직을 적용할 객체(Element)를 방문하면서 실행하는 패턴.
  • 로직과 구조를 분리하는 패턴.
  • 로직과 구조가 분리되면 구조를 수정하지 않고도 새로운 동작을 기존 객체 구조에 추가할 수 있다.
  • 비슷한 종류의 객체들을 가진 그룹에서 작업을 수행해야 할 때 주로 사용되는 패턴.

방문자 패턴의 구조

Visitor Pattern Structure

  • Visitor
    : 명령을 수행하기 위해 필요한 메소드를 정의하는 인터페이스.

  • ConcreteVisitor
    : 명령을 수행하는 메소드를 구현.

  • Element
    : Visit을 사용할 수 있는지 확인하는 accept 메소드를 정의하는 인터페이스

  • ConcreteElement
    : Visitable에서 정의된 accept 메소드를 구현하며 Visitor 객체는 이 객체를 통하여 명령이 전달됨.

방문자 패턴의 적용

  • 복잡한 객체 구조(객체 트리 등)의 모든 요소에 대해 작업을 수행해야 할 때 사용.
  • 행동이 클래스 계층구조의 일부 클래스들에서만 의미가 있고 다른 클래스들에서는 의미가 없을 때 사용.

중재자 패턴(Mediator Pattern)

중재자 패턴이란?

  • 객체들 간의 상호작용 행위를 정리하여 모은 중재자 객체를 따로 두어 관리하는 디자인 패턴.
  • 모든 클래스간의 복잡한 로직을 캡슐화하여 하나의 클래스에 위임하여 처리하는 패턴.
  • M:N의 관계에서 M:1의 관계로 복잡도를 떨어뜨려 유지 보수 및 재사용의 확장성에 유리한 패턴.
  • 커뮤니케이션 하고자 하는 객체가 있을 때 서로가 커뮤니케이션 하기 복잡한 경우 이를 해결해주고 서로 간 쉽게 해주며 커플링을
    약화시켜주는 패턴이다.

중재자 패턴의 구조

Mediator Pattern Structure

  • Mediator
    : Component 객체간의 상호작용을 위한 인터페이스를 정의한다.

  • ConcreteMediator
    : Mediator의 인터페이스를 구현하여 객체간의 상호작용을 조정한다.

중재자 패턴의 적용

  • 일부 클래스들이 다른 클래스들과 단단하게 결합하여 변경하기 어려울 때 사용.
  • 컴포넌트들에 너무 의존하기 때문에 다른 프로그램에서 컴포넌트를 재사용할 수 없는 경우에 사용.
    • 중재자 패턴을 적용하면 그 후 개별 컴포넌트들은 다른 컴포넌트를 인식하지 못함.
  • 몇 가지 기본 행동을 다양한 콘텍스트들에서 재사용하기 위해 수많은 컴포넌트 자식 클래스들을 만들고 있는 스스로를 발견했을때 사용.

상태 패턴(State Pattern)

상태 패턴이란?

  • 객체 내부의 상태에 따라 동작을 변경해야할 때 사용하는 디자인 패턴.
  • 객체의 특정 상태를 클래스로 선언하고 클래스에서는 해당 상태에서 할 수 있는 행위들을 메서드로 정의.
  • 각 상태 클래스들을 인터페이스로 캡슐화하여 클라이언트에서 인터페이스를 호출.

상태 패턴의 구조

State Pattern Structure

  • Context
    : 객체의 상태를 정의하는 데 사용되는 메소드를 정의하는 인터페이스.

  • State
    : 상태에 따른 동작을 정의하는 인터페이스.

  • ConcreteState
    : State에서 정의된 메소드를 구현하는 클래스.

상태 패턴의 적용

  • 현재 상태에 따라 다르게 행동하는 객체가 있을 때, 상태들의 수가 많을 때, 상태별 코드가 자주 변경될 때 사용.

메멘토 패턴(Memento Pattern)

메멘토 패턴이란?

  • 객체의 상태 정보를 가지는 클래스를 따로 생성하여 객체의 상태를 저장하거나 이전 상태로 복원할 수 있게 해주는 패턴.
  • 보드게임 등에서 '무르기' 기능을 구현할 때 사용되기도 함.
  • 이전 상태의 객체를 저장하기 위한 원래 객체가 클 경우 많은 메모리가 필요.

메멘토 패턴의 구조

Memento Pattern Structure

  • Originator
    : 객체의 상태를 저장한다. Memento 객체를 생성하며 후에 Memento를 사용하여 실행 취소를 할 수 있다.

  • Memento
    : Originator의 상태를 유지하는 객체이다.(POJO)

  • Caretaker
    : 복수의 Memento 상태를 유지해주는 객체이다.

메멘토 패턴의 적용

  • 객체의 이전 상태를 복원할 수 있도록 객체의 상태의 스냅샷들을 생성하려는 경우에 사용.
  • 객체의 필드들/게터들/세터들을 직접 접근하는 것이 해당 객체의 캡슐화를 위반할 때 사용.
profile
완벽하지 않기에 기록한다.

0개의 댓글