디자인 패턴/행위 패턴 11

Memento 패턴

Memento 패턴은 객체의 상태 정보를 가지는 클래스를 따로 생성하여, 객체의 상태를 저장하거나 이전 상태로 복원할 수 있게 해주는 패턴입니다. 구조 Originator Memento 객체와 Memento 객체 상태를 복원하는 Caretaker 객체에 상태를 만들고 저장하는 클래스입니다. Memento Originator의 상태 정보를 저장하는 클래스입니다. Caretaker Originator의 저장과 복원을 제어하는 클래스입니다. 각 시점의 Memento 객체들을 저장하는 Stack 자료구조를 가지고 있습니다. 활용 상황 객체를 이전의 상태로 복구시켜야 하는 경우가 존재할때 유용합니다. Memento 패턴의 장단점 장점 저장된 상태를 핵심 객체와는 다른 별도의 객체에 보관하기 때문에 안전합니다. 핵..

Mediator 패턴

Mediator 패턴은 모든 클래스간의 복잡한 상호작용을 캡슐화하여 하나의 클래스에 위임하여 처리하는 패턴입니다. 즉, M:N의 관계에서 M:1의 관계로 복잡도를 떨어뜨려 유지 보수 및 재사용의 확장성을 유리하게 해주는 패턴입니다. 구조 Mediator 여러 Colleague 객체들을 중재해주는 인터페이스를 정의한 추상 클래스입니다. ConcreteMediator Colleague 객체들을 가지고 있으면서 중재해주는 역할을 하는 클래스입니다. Colleague Mediator 객체에 의해서 관리 및 중재를 받을 기본 클래스입니다. ColleagueA, ColleagueB 실제로 Mediator 객체에 의해서 관리 및 중재를 받는 클래스를 구현한 클래스입니다. 활용 상황 서로 전혀 다른 객체간의 상호 통신..

Template Method 패턴

Template Method 패턴은 어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화하여 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 변경하는 패턴입니다. 구조 AbstractClass 템플릿 메서드를 정의하는 클래스입니다. 서브 클래스의 공통 알고리즘을 정의하고 서브 클래스에서 구현될 기능을 primitive 메서드로 정의합니다. ConcreteClass 상속받은 primitive 메서드 또는 hook 메서드를 구현하는 클래스입니다. 슈퍼 클래스에 구현된 템플릿 메서드의 일반적인 알고리즘 흐름에서 서브 클래스의 특색에 맞게 primitive 메서드 등을 구현하는 클래스입니다. 활용 상황 전체적인 알고리즘의 흐름은 동일하지만 알고리즘의 각 부분에서 구현을 다르게 하고 싶을때..

Strategy 패턴

Strategy 패턴은 행위를 클래스로 캡슐화하여 동적으로 행위를 자유롭게 변경할 수 있도록 해주는 패턴입니다. 같은 문제를 해결하는 여러 알고리즘이 클래스별로 캡슐화되어 있고 이들이 필요할때 교체할 수 있도록 함으로써 동일한 문제를 다른 알고리즘으로 해결할 수 있도록 해줍니다. 구조 Strategy 외부에서 동일한 방식으로 알고리즘을 호출하기 위한 메서드를 명시하는 인터페이스 클래스입니다. ConcreteStrategy Strategy 클래스에서 명시한 알고리즘을 실제로 구현한 클래스입니다. Context Strategy 클래스를 사용하는 역할을 수행합니다. 필요에 따라 동적으로 구체적인 전략을 변경할 수 있도록 setter 메서드를 제공합니다. 활용 상황 구현된 알고리즘은 다르지만 동일한 목적을 지닌..

Interpreter 패턴

Interpreter 패턴은 문법 규칙을 클래스화한 구조로, 일련의 규칙으로 정의된 문법적 언어를 해석하는 패턴입니다. Interpreter 패턴은 SQL과 같은 계층적 언어를 해석하기 위해 계층 구조를 표현할 수 있습니다. 구조 AbstractExpression 문장을 해석하기 위한 해석자 인터페이스 클래스입니다. TerminalExpression 문장의 종료를 나타내는 해석자 클래스 구현체입니다. NonTerminalExpression 문장의 비종료를 나타내는 해석자 클래스 구현체입니다. Context 문장을 저장하고 관리하는 클래스입니다. Client 실제로 Interpret 메서드를 호출하는 사용자 클래스입니다. 활용 상황 간단한 언어를 구현할때 유용합니다. 문법이 간단하며, 효율보다는 단순하게 ..

Chain of responsibility 패턴

Chain of responsibility 패턴은 명령 객체와 일련의 처리 객체들을 포함하는 디자인 패턴입니다. 각각의 처리 객체는 명령 객체를 처리할 수 있는 연산의 집합이고, 체인 안의 처리 객체가 핸들할 수 없는 명령은 다음 처리 객체로 넘겨집니다. 구조 Handler 요청을 처리하기 위한 수신자들이 가져야 할 인터페이스를 정의합니다. ConcreteHandler Handler 인터페이스를 구현하며, 각자가 요청 종류에 따라 자신이 처리할 수 있는 부분을 구현합니다. Client 수신자에게 처리를 요구합니다. 활용 상황 요청의 발신자와 수신자를 분리해야 할때 유용합니다. 요청을 처리할 수 있는 객체가 여러개이고 그 중 하나에 요청을 보내고 싶을때 유용합니다. 코드에서 처리 객체를 명시적으로 지정하고..

Iterator 패턴

Iterator 패턴은 접근 기능과 자료구조를 분리시켜서 객체화하는 패턴입니다. 즉, 서로 다른 구조를 가지고 있는 저장 객체에 동일한 인터페이스로 접근할 수 있도록 도와주는 패턴입니다. 구조 Iterator 집합체의 요소들을 순서대로 검색하기 위한 인터페이스를 정의합니다. ConcreteIterator Iterator 인터페이스를 구현합니다. Aggregate 여러 요소들로 이루어져 있는 집합체입니다. ConcreteAggregate Aggregate 인터페이스를 구현합니다. 활용 상황 정의한 방법과 다른 방법으로 요소들을 순회하고자 할때 유용합니다. 동일한 리스트에 대해서 하나 이상의 순회방법을 정의하고 싶을때 유용합니다. 객체 내부 표현 방식을 모르고도 집합체의 요소에 접근하고 싶을때 유용합니다. ..

Visitor 패턴

Visitor 패턴은 실제 로직을 가지고 있는 객체가 로직을 적용할 객체를 방문하면서 실행하는 패턴입니다. 즉, 로직과 구조를 분리하는 패턴이라고 볼 수 있습니다. 구조 Visitor 방문자 클래스의 인터페이스입니다. visit(Element) 메서드를 공용 인터페이스로 사용합니다. 여기서 Element는 방문 공간을 의미합니다. Element 방문 공간 클래스의 인터페이스입니다. accept(Visitor) 메서드를 공용 인터페이스로 사용합니다. 여기서 Visitor는 방문자를 의미합니다. 내부적으로 Visitor.visit(this)를 호출합니다. ConcreteVisitor Visitor를 구체적으로 구현한 클래스입니다. ConcreteElement Element를 구체적으로 구현한 클래스입니다. ..

Observer 패턴

Observer 패턴은 한 객체의 상태 변화에 따라 다른 객체의 상태도 연동되도록 일대다 객체 의존 관계를 구성하는 패턴입니다. 구조 Observer 데이터의 변경을 통보 받는 인터페이스입니다. 즉, Subject에서는 Observer 인터페이스의 update 메서드를 호출함으로써 ConcreteSubject의 데이터 변경을 ConcreteObserver에게 통보합니다. Subject ConcreteObserver 객체를 관리합니다. Observer 인터페이스를 참조하여 ConcreteObserver를 관리하므로 ConcreteObserver의 변화에 독립적일 수 있습니다. ConcreteSubject 변경 관리 대상이 되는 데이터가 있는 클래스입니다. 데이터 변경을 위한 메서드인 SetState가 있습..

Command 패턴

Command 패턴은 실행될 기능을 캡슐화함으로써 주어진 여러 기능을 실행할 수 있는 재사용성이 높은 클래스를 설계하는 패턴입니다. 구조 Invoker 기능의 실행을 요청하는 호출자 클래스입니다. Recevier ConcreteCommand에서 execute 메서드를 구현할때 필요한 클래스입니다. ConcreteCommand의 기능을 실행하기 위해 사용하는 수신자 클래스입니다. Command 실행될 기능에 대한 인터페이스입니다. 실행될 기능을 execute 메서드로 선언합니다. ConcreteCommand 실제로 실행되는 기능을 구현합니다. Command 인터페이스의 execute 메서드를 실제로 구현합니다. 활용 상황 이벤트가 발생했을때 실행될 기능이 다양하면서도 변경이 필요한 경우 유용합니다. 커맨드..