Behavior Pattern (행동 패턴)
행동 패턴에는 다음과 같이 11가지 패턴이 존재한다. Chain of Responsivility Command Interpreter Iterator Mdiator Memento Observer State Strategy Template Method Visitor 행동 패턴은 테스크의 처리를 어떤 객체가 할것인지에 대해 다룬다.
행동 패턴에는 다음과 같이 11가지 패턴이 존재한다. Chain of Responsivility Command Interpreter Iterator Mdiator Memento Observer State Strategy Template Method Visitor 행동 패턴은 테스크의 처리를 어떤 객체가 할것인지에 대해 다룬다.
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++파일을 빌드할 수 있는 시스템을 작성한다고 가정한다. 빌드 시스템은 전처리->컴파일->어셈블->링크 의 과정을 거치며 각각의 과정은 복잡한 서브시스템으로 구성되어있다. 그 중 컴파일 서브시스템은 소스코드를 파싱하고 어셈블리 코드를 생성해내는 인터페이스를 제공한다.(실제로는 더 복잡함) 퍼사드 패턴을 통해 컴..
c++11 이후로 overide와 final 키워드를 사용할 수 있게 되었다. 간단하게 생각하면 virtual 함수를 오버라이드 하고 싶다면 override키워드를 무조건 함께 사용해주자. 이유는 아래의 예시를 보면 class B에서 가상 함수의 시그니처를 변경하 였을 경우 override 키워드를 사용하지 않은 코드는 컴파일 에러가 발생하지 않는다. 따라서 override키워드를 넣어줌으로써 가상 함수 시그니처 변경의 실수를 막을 수 있고 가독성 또한 좋아진다. 1234567891011121314151617181920212223242526272829class A {public: virtual void doSomething(int a) { cout
Bridge Pattern (가교 패턴) 목적 추상적 개념에 해당하는 클래스 계통(Abstraction)과 구현에 해당하는 클래스 계통(Implementor)을 분리한다. 상속을 통한 구현은 구현과 추상적 개념을 영구적으로 종속시키기 때문에 수정, 확장이 쉽지 않다. 따라서 가교 패턴을 통해 수정, 확장의 용이점을 갖는다. 사용 시나리오 태블릿 디바이스가 9인치, 11인치, 13인치를 개발한다고 가정한다. 각 태블릿 마다 화면을 디스플레이한다는 공통점은 있지만 세로와 가로길이에 따라 구체적인 디스플레이 방법은 다르며 이를 각각 구현해야 한다. [Implementor] class DisplayImpl { //Implementor public: virtual void showDisplay() = 0; vir..
Sigletone Pattern (C++) 목적 프로그램 내에서 어떤 클래스가 오직 한 개의 인스턴스만 갖도록 보장하고 접근 할 수 있는 인터페이스를 제공한다. 자주 사용되지만 여러 인스턴스가 생성될 필요가 없는 경우 사용된다. (예 dbconnection, networking, config ...) c++에서 쓰레드 안전성을 위해 local static 변수를 활용하여 static Instance() 인터페이스를 구현했다. 전역 변수와 차이가 없어보이나 다음과 같은 이점이 있다. 1. 인스턴스를 인터페이스를 통해 유일하게 접근함. 2. name space를 좁혀줌 그러나 싱글톤을 남용할 경우 클래스간의 결합도가 커지는 문제점이 있다. 사용 시나리오 프로그램 내에서 네트워크에 접속하고 종료하는 기능을 하..
Prototype Pattern (C++) 목적 현재 객체를 복사하여 (속성값이 동일한 또는 거의 유사한)새로운 객체를 생성한다. java에서 clonnable 인터페이스(아래의 prototype class)와 동일하다. clone함수를 구현할 때 얕은 복사를 주의해야한다. 사용 시나리오 포토샵이나 ppt에서 도형을 복사하는 시나리오가 있다. 각각의 도형은 현재 도형의 바로 옆(x축으로 +1만큼 이동)에 생성 된다. [Prototype] class ShapePrototype { public: virtual ShapePrototype* clone() = 0; }; [ConcretePrototype] class Circle : public ShapePrototype { public: Circle(int x..
Builder Pattern (빌더 패턴) 목적 복잡한 객체를 생성하는 방법과 표현하는 방법을 분리한다. 즉, 생성 패턴의 결과물인 Product의 속성을 결정하는 부분과 생성하는 부분을 분리시킨다. Product를 생성할 때 Product에 전달해야 할 파라미터가 많다면 빌더 패턴을 고려해보는게 좋다. 사용 시나리오 Computer객체를 생성해야 하는 시스템이 있다. Computer객체는 각각 cpu, ram, ssd를 설정해야 하며 각각의 컴퓨터 제조사마다 스펙은 다르다. 각각 제조사마다 Builder를 만들고 Builder를 Director로 넘겨 Computer를 생산한다. 최종적으로 Client는 Director를 통해서 Product를 전달 받는다. [Product] class Computer..
Template Method Pattern (C++) 목적 객체의 연산에는 알고리즘 뼈대만(템플릿) 정의하고 각 단계에서 수행하는 구체적인 처리들은 서브클레스에게 위임한다. 코드의 공통적인부분과 아닌 부분을 구별하여 코드 중복을 제거하고 hook연산을 추가하여 확장성을 높인다. 사용 시나리오 파일 뷰어를 만든다고 가정한다. 파일뷰어는 doc,txt등 여러 확장자의 파일들을 보여줄 수 있다. 파일을 보여줄 때 내부적으로 항상 open -> view -> save log과정을 거친다. [AbstractClass] class FileViewer { public: void viewFile() { //템플릿 메소드 역할을 하는 함수 open(); view(); saveLog(); hookFunc(); } pro..