Chain of Responsibility Pattern

요청을 한 객체에서 다른 객체로 전달하며, 각 객체가 요청을 처리할지 여부를 결정하는 구조이다. Motivation 애플리케이션에서 로그를 처리하는데, 여러 종류의 로그 메시지가 있다고 하자. 정보, 경고, 오류 메시지가 있으며, 각 메시지는 적절한 방식으로 처리되어야 한다. 오류 메시지는 콘솔에 즉시 출력하고, 정보 메시지는 파일에 저장하며, 경고 메시지는 원격 서버에 전송한다. 각 메시지를 처리하는 핸들러가 존재하며, 메시지의 종류에 따라 적합한 핸들러가 메시지를 처리해야 한다. 책임 연쇄 패턴을 사용하면 로그 메시지 처리 체인을 구성하여 해결할 수 있다....

January 31, 2025 · 5 min · Beomsu Lee

Command Pattern

요청 자체를 캡슐화하여, 사용자와 시스템 간 요청을 파라미터화하고, 요청을 큐에 넣거나 로그로 저장하거나, 작업을 실행할 수 있게 하는 패턴이다. 이 패턴은 요청을 실행하는 객체와 그 요청을 큐에서 실행하는 객체를 분리할 수 있도록 해준다. Motivation 리모컨에서 여러 기기들(예: TV, 전등, 팬)에 대한 다양한 명령을 보낸다고 하자. 이 시스템에서는 사용자가 버튼을 눌러 특정 기기와 기능을 제어할 수 있어야 한다. 커맨드 패턴을 적용하여 각 버튼이 특정 명령을 실행하도록 구성하여 유연하게 시스템을 관리할 수 있다....

January 31, 2025 · 5 min · Beomsu Lee

Decorator Pattern

객체에 동적으로 새로운 책임을 추가할 수 있게 한다. 상속을 사용하지 않고도 객체의 기능을 확장할 수 있다. Motivation 어떤 기능을 추가하려면 기존 클래스를 계속 수정해야 하므로 OCP 원칙을 위반하게 된다. 즉, 새로운 기능을 추가할 때마다 새로운 클래스를 만들어야 한다. 데코레이터 패턴을 적용하면 기능을 동적으로 추가할 수 있으며, 코드의 재사용과 확장성이 증가한다. Applicability 동적이며 투명하게, 즉 다른 객체에 영향을 주지 않고 개별의 객체에 새로운 책임을 추가해야 할 때 제거될 수 있는 책임일 때 실제 상속으로 서브클래스를 계속 만드는 방법이 실질적이지 못할 때 Structure Component: 동적으로 추가할 기능을 가질 가능성들이 있는 객체에 대한 인터페이스 ConcreteComponent: 추가적인 기능이 실제 정의되어야 할 필요가 있는 객체 Decorator: Component 객체에 대한 참조자를 관리하면서 Component에 정의된 인터페이스를 만족하도록 인터페이스를 정의 ConcreteDecorator: Component에 새롭게 추가할 기능을 실제로 구현하는 클래스 Collaborations Decorator는 자신이 Component 객체 쪽으로 요청을 전달한다....

January 30, 2025 · 4 min · Beomsu Lee

Facade Pattern

한 서브시스템 내 인터페이스 집합에 대한 획일화된 하나의 인터페이스를 제공하는 패턴이다. 서브시스템을 사용하기 쉽도록 높은 수준의 인터페이스를 제공한다. 서브시스템이란 시스템의 컴포넌트로, 독립적이거나 부분적으로 독립적인 기능을 제공하는 하위 시스템을 의미한다. 즉, 전체 시스템을 구성하는 기능적인 부분들 중 하나로 특정 작업을 담당한다. Motivation 애플리케이션이 Scanner, Parser, ProgramNode 등의 컴파일러 서브시스템의 하위 클래스를 직접 사용하는 것은 복잡하고 어려운 작업일 수 있다. 퍼사드 패턴을 사용해 시스템의 복잡한 부분을 숨기고, 애플리케이션이 필요한 고수준 기능만 사용할 수 있게 한다....

January 30, 2025 · 4 min · Beomsu Lee

Flyweight Pattern

공유를 통해 많은 수의 세밀한(fine-grained) 객체들을 효과적으로 지원한다. Motivation 게임에서 각 객체가 같은 속성을 가지지만 다수의 인스턴스를 만들 경우, 이로 인해 메모리 낭비와 성능 저하가 발생될 수 있다. 예를 들어, 여러 객체가 같은 색상, 크기, 형태 등 공통된 속성을 가질 때, 이를 매번 새로 생성하는 것은 비효율적이다. Flyweight 패턴을 적용하면 공유 가능한 부분을 외부에서 관리하고, 변경 가능한 부분만 각 객체에 보관하여 메모리 사용을 최적화할 수 있다. Applicability 애플리케이션이 대량의 객체를 사용해야 할 때 객체의 수가 너무 많아져 저장 비용이 높아질 때 대부분의 객체 상태를 부가적인 것으로 만들 수 있을 때 부가적인 속성들을 제거하면 객체들이 동일한 특성을 가질 때 애플리케이션이 객체의 정체성에 의존하지 않을 때 Structure Flyweight 객체의 공유 방법은 다음과 같다....

January 30, 2025 · 5 min · Beomsu Lee