Proxy Pattern (프록시 패턴) 목적 Proxy(대리자, 대리인) pattern은 A라는 객체를 접근, 제어하기 위해 대리자인 proxyA를 통해서만 접근 가능하도록 하는 구조를 만드는 패턴이다. 또한 이 패턴은 A라는 객체를 실제로 사용하기 전까지는 객체 생성과 초기화에 들어가는 비용을 발생시키지 않겠다는 의미이다.(포인터와 유사) 또한 proxyA객체는 A객체의 속성값을 변경시켜서는 안된다. 사용 시나리오 어떤 웹페이지 하단에 이미지가 존재한다고 가정한다. 해당 이미지는 사용자가 스크롤을 내릴때만(필요할때만) 불러오게 구현한다. [Subject(interface)] class Image { public: virtual void renderImage() = 0; virtual ~Image();..
Flyweight Pattern (플라이웨이트 패턴) 목적 동일한 객체를 관리하고 공유하여 메모리를 절약한다. 객체관리는 팩토리를 통해서 하며 객체들을 중복없이 관리하기 위해 map자료구조를 활용한다. 사용 시나리오 어떤 플렛폼에서 광고용 영상 컨텐츠를 관리한다고 가정한다. 사용자가 컨텐츠를 요구할 때 파일을 한번만 로딩한 뒤 다음 사용자 부터는 로딩하지 않고 컨텐츠를 제공한다. [Flyweight] class Contents { public: virtual void play() = 0; }; [ConcreteFlyweight] class Movie : public Contents { public: Movie(string title) { this->title = title; cout
Facade Pattern (퍼사드 패턴) 목적 복잡한 서브시스템 내의 인터페이스 집합에 대해서 사용자에게 꼭 필요한 획일화된 인터페이스만을 제공한다. Facade는 사전상 의미로 표면, 겉, 외관을 의미한다. 의미 그대로 복잡한 서브시스템은 속으로 숨기고 사용자에게 필요한 인터페이스만 표면(Facade)로 보여준다. 이러한 패턴은 사용자와 서브시스템 간의 결합도를 줄여준다. 사용 시나리오 c, c++파일을 빌드할 수 있는 시스템을 작성한다고 가정한다. 빌드 시스템은 전처리->컴파일->어셈블->링크 의 과정을 거치며 각각의 과정은 복잡한 서브시스템으로 구성되어있다. 그 중 컴파일 서브시스템은 소스코드를 파싱하고 어셈블리 코드를 생성해내는 인터페이스를 제공한다.(실제로는 더 복잡함) 퍼사드 패턴을 통해 컴..
Bridge Pattern (가교 패턴) 목적 추상적 개념에 해당하는 클래스 계통(Abstraction)과 구현에 해당하는 클래스 계통(Implementor)을 분리한다. 상속을 통한 구현은 구현과 추상적 개념을 영구적으로 종속시키기 때문에 수정, 확장이 쉽지 않다. 따라서 가교 패턴을 통해 수정, 확장의 용이점을 갖는다. 사용 시나리오 태블릿 디바이스가 9인치, 11인치, 13인치를 개발한다고 가정한다. 각 태블릿 마다 화면을 디스플레이한다는 공통점은 있지만 세로와 가로길이에 따라 구체적인 디스플레이 방법은 다르며 이를 각각 구현해야 한다. [Implementor] class DisplayImpl { //Implementor public: virtual void showDisplay() = 0; vir..
Decorator Pattern (C++) 목적 상황과 용도에 맞게객체에 동적으로 새로운 책임을 추가할 수 있다. OCP를 잘 나타내는 패턴으로 기능 확장이 필요할 때 기존 코드 수정 없이 확장이 가능한 구조이다. 그러나 단점으로는 데코레이터가 증가할 수록 작은 규모의 객체들이 많이 생기게 된다. 사용 시나리오 위젯을 그리는(Draw)하는 프로그램을 만든다고 가정한다. 여러가지 위젯중 캘린더 위젯을 만들고 위젯은 Scroller, Boarder로 구성할 수 있다. [Component] 동적으로 추가할 객체들의 인터페이스 역할을 한다. class WidgetComponent { public: virtual void Draw() = 0; }; [ConcreteComponent] 제공할 서비스의 베이스가 되..
Composite Pattern(복합체 패턴) 목적 부분과 전체의 계층을 표현하기 위해 객체들을 하나의 인터페이스(Component)로 묶어 트리 구조로 구조화 한다. 사용 시나리오 1. 루트(/) 디렉토리는 여러 파일과 폴더를 포함하고 있다. 2. 폴더도 여러 파일과 폴더를 포함하고 있다. [Component] 집합 관계에 정의될 모든 객체에 대한 인터페이스를 정의. Leaf와 Composite 클래스를 트리화 하기 위한 추상 클래스 class Component { public: Component(string componentName) { this->componentName = componentName; } virtual ~Component(){ } virtual void ShowName() const..
Adapter Pattern (적응자 패턴)목적기존의 라이브러리나 프레임워크 또는 프로젝트 내에서 공통적으로 사용하여 코드 수정이 쉽지 않은 class등을 수정하지 않고 내가 원하는 기능을 추가할 수 있도록 변환(adapt) 시킨다. 사용 시나리오 1. 시스템에서 블루투스, WIFI를 키고 끌수 있는 프레임워크를 제공한다. 2. 개발하는 앱에서 블루투스,WIFI를 키고 끄는 기능을 제공하며 킬 때, 끌 때 로그를 저장하는 기능을 제공한다. [Adaptee]블루투스,WIFI 프레임워크가 adaptee가 된다. 활성화와 비활성화 기능을 제공한다. class BluetoothFW { public: static void ActivateBT() { cout
구조 패턴에는 다음과 같이 7가지의 패턴이 있다.AdapterBridgeCompositeDecoratorFacadeFlyweightProxy구조패턴의 목적은 프로그램 내의 효율적인 구조를 형성하기 위해 클래스와 객체를 어떻게 합성하는가에 관련된 패턴이다.클래스를 기반으로 구조화 한다면(Adapter패턴) 상속을 사용하고 객체를 기반으로 구조화 할때는(나머지 모든 패턴) 객체 복합을 통해 구조화 한다.