본문 바로가기

설계

(27)
[디자인 패턴] 스테이트 패턴 (State Pattern) - python 예제 코드 State Pattern은 객체 지향 디자인 패턴 중 하나로, 객체의 내부 상태(state)에 따라서 객체의 행위를 변화시키는 방식을 제공합니다. 객체의 행위를 변화시키는 것은 객체의 메소드 호출을 통해서 이루어지지만, 이러한 호출은 객체의 상태에 따라 다른 메소드를 호출하게 됩니다. 이러한 상태를 캡슐화하고, 각 상태에 대한 행위를 별도의 객체로 분리하여 관리하게 됩니다. 1. 예제코드 주문 상태에 따라 다른 행위를 수행하는 주문 시스템을 구현한다고 가정해봅시다. 주문은 다음과 같은 세 가지 상태를 가질 수 있습니다. 주문 접수 대기중 주문 처리중 주문 완료 각 상태에 따라 수행되는 행위가 다르기 때문에, 이러한 상태를 객체로 분리하여 관리할 수 있습니다. 이를 State Pattern으로 구현하면, ..
[디자인 패턴] 옵저버 패턴 (Observer Pattern) - python 예제 코드 옵저버 패턴은 객체 간의 일대다 의존 관계를 정의하는 디자인 패턴 중 하나입니다. 이 패턴에서, 한 객체가 변경되면 그 객체에 의존하는 다른 객체들에게 알림이 전달되어 자동으로 업데이트 됩니다. 이를 통해 객체 간의 결합도를 줄이고, 유연한 설계를 가능하게 합니다. 1. 구성요소 Subject: 변경 사항이 발생하는 객체 Observer: 변경 사항을 알림 받는 객체 ConcreteSubject: Subject의 구현체 ConcreteObserver: Observer의 구현체 2. 예제 코드 파이썬으로 구현한 예제 코드는 다음과 같습니다. class Subject: def __init__(self): self._observers = [] def attach(self, observer): if observ..
[디자인 패턴] 메멘토 패턴 (Memento Pattern) - python 예제 코드 Memento 패턴은 객체의 상태를 저장하고, 나중에 복원하기 위한 패턴입니다. 이 패턴은 객체의 상태를 저장하는 Memento 객체와, 객체의 상태를 생성하는 Originator 객체, 그리고 Memento 객체를 관리하는 Caretaker 객체로 구성됩니다. 이 패턴을 사용하면 객체의 상태를 유지하면서, 상태를 수정하고 롤백하는 기능을 제공할 수 있습니다. 1. 예제 코드 예를 들어, 텍스트 에디터를 구현한다고 가정해봅시다. 이 때, 에디터의 상태는 사용자가 입력한 텍스트, 커서의 위치, 편집 모드 등이 될 수 있습니다. 이러한 상태를 저장하고 복원하기 위해 Memento 패턴을 사용할 수 있습니다. 다음은 Python으로 구현한 Memento 패턴 예제 코드입니다. class Editor: def ..
[디자인 패턴] 중재자 패턴 (Mediator Pattern) - python 예제 코드 중재자 패턴 (Mediator Pattern)은 객체들 간의 상호작용을 중재하는 객체를 도입하여 객체들 간의 결합도를 줄이고 유지보수성을 높이는 디자인 패턴입니다. 이 패턴에서 중재자(Mediator)는 객체들 간의 통신을 총괄하는 중앙 허브 역할을 하며, 객체들은 중재자를 통해 상호작용합니다. 이를 통해 객체들은 서로에 대해 알 필요 없이 중재자를 통해 상호작용할 수 있어서 결합도를 낮출 수 있습니다. 1. 예제 코드 아래는 중재자 패턴을 이해하기 위한 Python 코드 예제입니다. class Mediator: def __init__(self): self.colleague_1 = Colleague1(self) self.colleague_2 = Colleague2(self) def send_message..
[디자인 패턴] 반복자 패턴 (Iterator Pattern) - python 예제 코드 Iterator Pattern은 컬렉션에 저장된 요소를 순차적으로 접근하기 위한 디자인 패턴입니다. 이 패턴은 컬렉션과 반복 작업을 분리하여, 클라이언트 코드에서는 요소를 반복적으로 처리하는 로직만 작성하면 됩니다. 1. 구성요소 Iterator: 요소를 순차적으로 접근하기 위한 인터페이스를 제공합니다. 다음 요소에 접근하기 위한 next() 메서드와, 현재 요소의 존재 여부를 확인하기 위한 hasNext() 메서드가 포함됩니다. ConcreteIterator: Iterator 인터페이스를 구현하는 클래스입니다. 컬렉션에 대한 반복 작업을 수행합니다. Aggregate: 컬렉션의 인터페이스를 제공합니다. 요소를 추가하거나 삭제하는 메서드가 포함됩니다. ConcreteAggregate: Aggregate ..
[디자인 패턴] 커맨드 패턴 (Command Pattern) - python 예제 코드 커맨드 패턴(Command Pattern)은 객체지향 디자인 패턴의 하나로, 요청을 객체의 형태로 캡슐화하여 실행 가능한 작업으로 만드는 패턴입니다. 이 패턴은 요청을 발신자와 수신자 사이에 있는 객체들을 분리시키며, 이를 통해 요청의 종류, 매개변수, 실행 시점을 제어할 수 있게 됩니다. 1. 커맨드 패턴의 주요 구성요소 Command: 요청을 캡슐화하는 인터페이스. execute() 메소드를 포함합니다. ConcreteCommand: Command 인터페이스를 구현한 구체적인 클래스. 실제 요청을 수행합니다. Receiver: ConcreteCommand 객체에서 요청을 수행하는 객체. Invoker: Command 객체를 생성하고 실행하는 객체. Client: Command 객체를 생성하고 Invo..
[디자인 패턴] 책임 연쇄 패턴 (Chain of Responsibility Pattern) - python 예제 코드 책임 연쇄 패턴은 객체의 처리 요청을 받은 객체가 그 요청을 처리하지 못할 경우 다음 객체에게 책임을 전달하여 처리를 이어가는 디자인 패턴입니다. 이를 통해 객체 간의 결합도를 낮추고 유연성을 높일 수 있습니다. 책임 연쇄 패턴은 보통 객체들이 리스트 형태로 연결되어 있으며, 각 객체는 다음 객체에 대한 참조를 유지합니다. 클라이언트는 요청을 보내고, 첫 번째 객체는 요청을 처리할 수 있는지 검사한 후 요청을 처리할 수 없으면 다음 객체에게 요청을 전달합니다. 이러한 과정을 반복하여 적절한 객체가 요청을 처리할 때까지 진행합니다. 1. 예제 코드 Python으로 구현된 간단한 예제를 살펴보겠습니다. 우리는 로그 메시지를 처리하는 책임 연쇄 패턴을 구현할 것입니다. 로그 메시지에는 세 가지 유형이 있습니다..
[디자인 패턴] 프록시 패턴 (Proxy Pattern) - python 예제 코드 프록시 패턴은 객체 지향 디자인 패턴 중 하나로, 다른 객체에 대한 대리자(proxy)를 제공하여 해당 객체에 대한 간접적인 접근을 가능하게 합니다. 이 패턴은 프록시 객체를 통해 원본 객체에 접근하는 방법을 제어하므로, 프록시 객체를 통해 원본 객체에 대한 접근을 제한하거나, 캐싱, 인증, 로깅 등의 부가 기능을 추가할 수 있습니다. 1. 예제 코드 Python에서는 다음과 같이 프록시 패턴을 구현할 수 있습니다. # 프록시 인터페이스 class Subject: def request(self): pass # 실제 객체 class RealSubject(Subject): def request(self): print("RealSubject의 request() 메서드 호출") # 프록시 객체 class Pro..