책임 연쇄 패턴 요청을 처리할 수 있는 여러 객체들 사이에서 요청을 전달하는 디자인 패턴. 이 패턴을 사용하면 요청을 보내는 쪽과 이를 처리하는 쪽을 분리할 수 있으며, 요청을 처리할 객체가 누구인지 클라이언트는 몰라도 된다. 구조 Handler: 모든 처리기(Handler)에 공통적인 인터페이스를 정의한다. 이 인터페이스는 일반적으로 요청을 처리하는 메소드를 포함한다. ConcreteHandler: 실제 요청을 처리하는 클래스. 만약 해당 클래스가 요청을 처리할 수 없다면 다음 처리기로 요청을 전달한다. Client: 요청을 처리기 체인에 보내는 역할. 클라이언트는 체인의 어떤 부분이 요청을 처리하는지 알 필요가 없다. 기본 인터페이스 // Handler 인터페이스 public interface IHa..
프록시 패턴 프록시 패턴은 다른 객체의 기능을 대리하거나 접근을 제어하는 디자인 패턴이다. 이 패턴은 클라이언트가 실제 객체(RealSubject)를 직접 호출하지 않고, 대신 프록시(Proxy) 객체를 통해 요청을 중계한다. 이를 통해 RealSubject에 대한 접근을 제어하거나 추가적인 기능을 제공할 수 있다. 구조 Subject - RealSubject와 Proxy가 구현해야 할 메소드를 정의한다. 클라이언트는 이 인터페이스를 통해 RealSubject 또는 Proxy와 상호 작용한다. RealSubject - 실제로 서비스를 제공하는 클래스. Proxy는 이 클래스의 인스턴스에 대한 요청을 중계한다. Proxy -RealSubject 클래스의 기능을 대리하는 역할. Proxy는 RealSu..
플라이웨이트 패턴 객체를 가볍게 만들어 메모리 사용량을 줄이는 패턴. 자주 변하는 속성과 불변 속성을 분리하고 불변 속성을 재사용함으로써 메모리 사용량을 줄일 수 있다. 구조 Flyweight - Flyweight가 받아들일 수 있고, 부가적 상태에서 동작해야 하는 인터페이스를 선언한다. ConcreteFlyweight - Flyweight 인터페이스를 구현하고 내부적으로 갖고 있어야 하는 본질적 상태에 대한 저장소를 정의한다. ConcreteFlyweight 객체는 공유할 수 있는 것이어야 한다. UnsharedConcreteFlyweight - 공유될 필요가 없는 Flyweight 구현 클래스. FlyweightFactory - Flyweight 객체를 생성하고 관리하며, Flyweight 객체가..
퍼사드 패턴 여러 개의 서브 시스템이나 복잡한 클래스들을 간단한 인터페이스를 통해 외부로 노출시키는 패턴. 클라이언트에게 획일화된 하나의 인터페이스를 제공함으로써, 클라이언트는 복잡합 동작 과정을 알 필요가 없이 인터페이스의 기능을 사용할 수 있다. 구조 기본 인터페이스 //서브시스템 클래스 class SubSystem1 { public void Method1() { //구현 로직 } } class SubSystem2 { public void Method2() { //구현 로직 } } //퍼사드 클래스 class Facade { private SubSystem1 sub1; private SubSystem2 sub2; public Facade() { sub1 = new SubSystem1(); sub2 =..
데코레이터 패턴 기존의 객체에 동적으로 새로운 기능을 추가할 수 있게 해주는 패턴이다. 새로운 기능을 추가한 서브클래스를 생성하는 것보다 융통성 있는 방법을 제공한다. 본래의 기능을 새로운 기능이 감싸안음으로써 기능을 더할 수 있다. 구조 Component - 동적으로 추가할 서비스를 가질 가능성이 있는 객체들에 대한 인터페이스 ConcreteComponent - 추가적인 서비스가 실제로 정의되어야 할 필요가 있는 객체 Decorator - 객체에 대한 참조자를 관리하면서 Component에 정의된 인터페이스를 만족하도록 인터페이스를 정의 ComcreteDecorator - Component에 새롭게 추가할 서비스를 실제로 구현하는 클래스 기본 인터페이스 public interface Component..
컴포지트 패턴 어떤 객체들의 구성을 표현하기 위해 사용되며, 개별 객체와 복합 객체를 동일한 인터페이스를 통해 다룰 수 있도록 해주는 디자인 패턴이다. 이 패턴은 개별 객체와 복합 객체를 구분하지 않고 동일한 방식으로 취급함으로써 클라이언트 코드가 단일 객체나 객체 구성을 일관되게 처리할 수 있게 해준다. 구조 Component - 개별 객체와 복합 객체가 구현해야 하는 공통 인터페이스를 정의한다. 순환 구조에서 요소들을 포함하는 전체 클래스에 접근하는데 필요한 인터페이스를 정의하며, 적절하다면 그 인터페이스를 구현한다. Leaf - 개별 객체를 나타내며 Component 인터페이스를 구현한다. Component에 Composite - 복합 객체를 나타내며 자식 컴포넌트를 관리하고 Component 인터..
브릿지 패턴 구현에서 추상을 분리하여, 이들이 독립적으로 다양성을 가질 수 있도록 만들어준다. 큰 클래스 또는 밀접하게 관련된 클래스들의 집합을 두 개의 개별 계층구조(추상화 및 구현)로 나눈 후 각각 독립적으로 개발할 수 있도록 하는 구조 디자인 패턴이다. 구조 Abstraction - 추상적 개념에 대한 인터페이스를 제공하고 객체 구현자에 대한 참조자를 관리한다. RefinedAbstraction - 추상적 개념에 정의된 인터페이스를 확장한다. Implementor - 구현 클래스에 대한 인터페이스를 제공한다. 실질적인 구현을 제공한 서브클래스들에 공통적인 연산의 시그니처만을 정의한다. 일반적으로 Implementor 인터페이스는 기본적인 구현 연산을 구행하고, Abstraction은 더 추상화..
어댑터 패턴 클래스의 인터페이스를 사용자가 원하는 인터페이스 형태로 적응(변환)시킨다. 서로 일치하지 않는 인터페이스를 갖는 클래스들을 함께 동작시킨다. 구조 Target - 사용자가 사용할 응용 분야에 종속적인 인터페이스를 정의하는 클래스 Adaptee - 인터페이스의 적응이 필요한 기존 인터페이스를 정의하는 클래스 Adapter - Target 인터페이스에 Adaptee의 인터페이스를 적응시키는 클래스 기본 인터페이스 //클래스 어댑터 - 타겟 인터페이스에 구체 Adaptee를 실행시킨다. public interface ITarget { public void Operate(); } public class Adaptee { public void SpecificOperation() { Console.Wr..