옵저버 패턴 객체를 가볍게 만들어 메모리 사용량을 줄이는 패턴. 자주 변하는 속성과 불변 속성을 분리하고 불변 속성을 재사용함으로써 메모리 사용량을 줄일 수 있다. 구조 Subject - Observer(감시자)를 을 알고 있는 구독자. 임의의 개수의 감시자 객체는 Subject를 감시한다. Subject의 상태가 변경되면 Observer에게 알림을 보낸다. Observer - Subject의 상태 변화를 갱신하는 데 필요한 인터페이스를 정의한다. Subject의 변경에 따라 변화되어야 하는 객체들의 일관성이 유지된다. ConcreteSubject - ConcreteObserver 객체에게 알려주어야 하는 상태를 저장한다. 상태가 변경되면 해당 ConcreteObserver에 변경을 통보한다. Con..
프로그래밍 이론
상태 패턴 객체 내부 상태 변경에 따라 객체의 행동이 달라지는 패턴. 상태에 특화된 행동들을 분리해 낼 수 있으며, 새로운 행동을 추가하더라도 다른 행동에 영향을 주지 않는다. 구조 Context - 사용자가 관심 있는 인터페이스를 정의한다. 객체의 현재 상태를 정의한 ConcreteState 클래스 객체를 유지 및 관리한다. State - Context의 각 상태별로 필요한 핸동을 캡슐화하여 인터페이스로 정의한다. ConcreteState 클래스들 - 각 서브클래스들은 Context의 상태에 따라 처리되어야 할 실제 행동을 구혀한다. 기본 인터페이스 public interface IState { void Handle(Context context); } public class ConcreteSta..
메멘토 패턴 객체의 상태를 이전의 상태로 복원할 수 있는 방법을 제공하는 디자인 패턴. 객체의 상태를 캡처하고 필요할 때 그 상태를 복원하는 기능을 통해, 객체의 내부 상태에 대한 직접적인 접근을 피하면서도 상태 정보를 외부에 저장하고 관리할 수 있다. 구조 Memento - 객체의 내부 상태를 저장하는 클래스. 객체의 상태를 저장하거나 복원하기 위해 사용된다. Originator - 원조 객체. 메멘토를 생성하여 현재 객체의상태를 저장하고, 메멘토를 사용하여 내부 상태를 복원한다. Caretaker - 메멘토의 보관을 책임지는 클래스. 메멘토의 내부 상태를 읽거나 접근하지 못하고 단지 보관만 한다. 기본 인터페이스 public class Memento { public string State { ge..
중재자 패턴 객체 간의 복잡한 상호작용을 캡슐화하는 디자인 패턴. 객체들 사이의 직접적인 참조와 통신을 줄이고, 이를 대신하여 중재자 객체를 통해 상호작용하도록 함으로써 객체 간의 결합도를 낮춘다. 구조 Mediator - 각 객체간 상호작용에 필요한 인터페이스를 정의한다. ConcreteMediator - Colleague 객체간의 협력 행동을 구현한다. 자신이 맡은 Colleague를 파악하고 관리한다. Colleague - 시스템 내의 객체들로, 서로 직접적으로 통신하지 않고 중재자를 통해 상호작용한다. 각 객체는 중재자에 대한 참조를 가지고 있어야 한다. 기본 인터페이스 public interface IMediator { void SendMessage(string message, Colleag..
전략 패턴 알고리즘의 실행 방법을 변경할 수 있게 해주는 패턴. 동일 계열의 알고리즘을 정의하고, 각 알고리즘을 캡슐화하며, 이들을 상호교환이 가능하도록 만든다. 구조 Strategy - 제공하는 모든 알고리즘에 대한 공통된 연산들을 인터페이스로 정의한다. ConcreteStrategy - Strategy 인터페이스를 실제 알고리즘으로 구현한다. Context - Strategy 객체를 사용하는 클래스. 필요에 따라 Strategy 서브 클래스에 접근하는 방법을 정의한다. 기본 인터페이스 // 전략 인터페이스 정의 public interface IStrategy { void Execute(); } // 구체적인 전략을 구현하는 클래스들 public class ConcreteStrategyA : IStra..
이터레이터 패턴 컬렉션(예: 리스트, 스택, 트리 등)의 요소를 순회하는 표준 방법을 제공하는 디자인 패턴. 집합 객체를 순회하는 클라이언트 코드를 변경하지 않고 컬렉션들에 접근할 수 있는 다양한 순회 방법을 제공한다. 구조 Iterator - 다음 요소에 접근하거나, 다음 요소가 있는지 확인하는 메소드 등을 정의한다. ConcreteIterator - Iterator 인터페이스를 구현하는 클래스. 컬렉션의 특정 구현 방식(예: 배열, 연결 리스트)에 따라 이터레이터의 순회 로직을 구현한다. Aggregate -Iterator 객체를 생성하는 메소드를 정의하는 클래스. ConcreteAggregate -Aggregate 인터페이스를 구현하는 클래스. 실제 컬렉션을 관리하며, 해당 컬렉션에 대한 It..
인터프리터 패턴 주로 프로그래밍 언어의 해석기나 특정 문제를 해결하기 위한 도메인 전용 언어(Domain Specific Language, DSL)를 구현할 때 사용되는 디자인 패턴. 언어의 문법 규칙을 클래스로 표현하고, 해당 클래스의 인스턴스를 사용하여 문장을 해석하는 방식을 제공한다. 구조 Expression - 트리에 속한 모든 노드에 해당하는 클래스들이 공통으로 가져야 할 interpret 연산을 추상 연산으로 정의한다. TermianlExpression - 문법의 기본 요소를 해석하는 방법을 구현한다. 문장을 구성하는 모든 기호에 대해서 해당 클래스를 만들어야 한다. NonterminalExpression - 문법의 규칙을 구성하는 역할을 한다. Context - interpret 연산..
커맨드 패턴 요청을 객체로 캡슐화하여 사용자가 발생시킨 요청을 기록, 큐에 저장, 실행 취소 등을 가능하게 하는 디자인 패턴. 요청하는 객체와 요청을 수행하는 객체 사이의 결합도를 낮추고, 요청을 객체로 만들어 다양한 요구, 큐 또는 로그 요구에 쉽게 맞출 수 있다. 구조 Command - 실행될 모든 명령에 대한 인터페이스를 정의한다. ConcreteCommand - Command 인터페이스를 구현하며, Receiver 객체에 정의된 연산을 호출한다. Receiver -명령이 수행될 때 실제로 연산을 수행하는 객체.ConcreteCommand는 이 Receiver 객체의 특정 연산을 호출하여 요청을 수행한다. Invoker -명령을 요청하는 역할을 하는 객체.명령 객체를 저장하고, 명령을 실행하기 ..