본문 바로가기

Language/C++ Design Pattern

(14)
데코레이터 패턴 의도: 객체에 추가적인 책임을 동적으로 부여한다. 데코레이터는 기능을 확장하는 데 서브클래싱에 대한 유연한 대안을 제공한다. 데코레이터 패턴은 사용자 정의를 계통적으로 추가한다.아래 UML 도표를 보자. DecoratedItem 클래스를 도입하고 변경이 필요한 관심사를 분리해 SRP를 따른다. 이 관심사를 분리해 새로운 가격 변경자를 쉽게 추가할 수 있게 해 OCP 원칙도 따른다. DecoratedItem 클래스의 계통적이며 재귀적인 본질과 서로 다른 변경자를 쉽게 재사용하고 결합할 수 있는 능력으로 인해 DRY 원칙의 조언도 따른다. // ... Item.h#define Money doubleclass Item{ public: virtual ~Item() = default; virtual..
외부 다향성 패턴 의도: '상속에 의한 관계가 없거나 가상 메서드가 없는 C++ 클래스를 다향적으로 처리할 수 있게 한다.이러한 관련 없는 클래스는 이를 사용하는 소프트웨어에서 공통된 방법으로 처리 할 수 있다.' 외부 다향성 디자인 패턴에서는 (Circle, Square 등) 서로 다른 도형을 보통의 비다향성 타입으로 가정한다. 또한 도형은 그리기에 대해 아무것도 모를 것을 기대한다. 도형이 Shape 기초 클래스를 상속할 것을 요구하는 대신, 이 디자인 패턴은 ShapeConcept와 ShapeModel 클래스 형태로 상속 계통을 별도로 도입한다. 아래 UML 도표를 살펴보자.아키텟처 최상위 수준에 도형의 추상화를 나타내는 ShapeConcept 와 ShapeModel 클래스가 있다. Circle 과 Square는 이..
ProtoType 패턴 프로토타입 디자인 패턴은 사인방이 수집한 생성 디자인 패턴 다섯가지 중 하나다. 이는 추상적인 개체의 복사본을 생성하는 추상적인 방법을 제공하는데 초점을 맞춘다. 의도: '원형의 인스턴스를 사용해 생성할 객체를 지정하고 이 원형을 복사해 새 객체를 생성한다' 아래 그림은 GOF 에서 가져온 원래 UML공식화이다. 프로토타입 디자인 패턴은 일반적으로 기초 클래스 내 clone() 가삼 함수로 구현한다. 갱신한 Animal 기초클래스를 살펴보자.//----- ------class Animal{ public: virtual ~Animal() = default; virtual void makeSound() const = 0; virtual std::unique_ptr clone const =..
Bridge 패턴 브리지의 목적은 구현 상세 일부를 추상화 뒤로 캡슐화해 물리적 의존성을 최소화 하는 것이다. 의도: ' 추상화를 그 구현과 분리해 그 둘이 독립적으로 달라질 수 있게 한다.' 즉, 함께 작동해야 하지만 서로에 대해 너무 많은 상세 내용을 알아서는 안되는 두 기능이 적당한 거리를 유지하며 물리적 의존성을 줄일 수 있게 지원하며 분리를 돕는다. 예시로 자동차를 구현해야한다고 하자. 자동차는 필수로 engine이 필요하기 때문에, 역시 engine 클래스도 같이 들어간다.#inlcude class SedanCar{ public: SedanCar(/* ... */) void drive(); // ... private: GasolineEngine mEngine; ..
Adapter 패턴 어댑터 디자인 패턴은 인터페이스를 표준화하고 기능을 기존 상속 계통에 비간섭적으로 추가하도록 돕는데 중점을 둔다. 의도: ' 클래스 인터페이스를 클라이언트가 기대하는 다른 인터페이스로 변환한다. 어댑터를 사용하면 호환되지 않는 인터페이스 때문에 함께 작동할 수 없는 클래스를 함께 작동하게 한다.' 기존에 이미 구현되어 있는 Document interface가 있다고 하자.새로운 라이브러리인 Pages를 도입해야 하며, "Document interface와 호환 되어야 한다" 라는 요구사항이 있다고 하면,위 다이아그램과 같이 "객체 어댑터" 를 사용하여 요구사항을 만족 시킨다.어댑터 패턴을 활용해 기존 Pages 클래스를 수정하지 않고 매우 쉽게 통합할 수 있다. 아래 Document 클래스를 보자.cla..
Command 패턴 커맨드 패턴(C++ 디자인 책 정리)커맨드 디자인 패턴은 (대개) 한 번 그리고 (보통) 즉시 실행하는 작업 꾸러미의 추상화와 분리에 초점을 맞춘다. 커맨드 디자인 패턴의 의도는 다음과 같다.의도: ' 요청을 객체로 캡슐화해 클라이언트를 다른 요청, 큐 또는 로그 요청 등으로 매개변수화하고 실행 취소할 수 있는 연산을 지원하게 한다.' OO 기반 형식에서 커맨드 패턴은 Command 기초 클래스 형식의 추상화를 도입한다. 이를 통해 누구나 새 ConcreateCommand를 구현할 수 있다. 그 ConcreteCommand는 무엇이든 할 수 있으며 심지어 Receiver에 행동을 수행할 수도 있다.명령 효과는 특정 Invoker가 추상 기초 클래스를 통해 유발한다. 커맨드 디자인 패턴의 구체적인 예로 다..
Strategy 패턴 전략 패턴(C++ 소프트웨어 디자인 책 정리)전략 디자인 패턴의 의도는 다음과 같다. '알고리즘 군을 정의하고 각각을 캡슐화해 상호 교환이 가능하게 한다. 전략을 사용하면 알고리즘 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다' 지난 visitor 패턴에서 사용한 주제로 전략 디자인 패턴을 UML로 표현하면 다음과 같다. 파생 클래스에서 가상의 draw() 함수를 구현하는 대신 여러분은 도형 그리기를 위해 다른 클래스를 도입한다.전략 디자인 패턴의 고전적인 객체 지향 형식의 경우 DrawStrategy 기본 클래스를 도입해 이를 해낸다. 위 UML처럼 그리기 관심사의 격리로 이제 도형 클래스를 수정하지 않고 그리기 구현을 변경할 수 있다.//----- ------class Circle;c..
Visitor 패턴 (std::variant) (C++ 소프트웨어 디자인 책 정리)  앞서 구현한 Visitor 패턴을 std::variant, std::visit을 사용해서 구현해보자. std::variantstd::variant 는 변수를 여러 타입을 선택하여 만든 후 선택한 타입 중 하나만 담을 수 있다.아래 main() 예시를 보자.int main(){ //0으로 초기화한 'int'를 담고 있는 기본 variant를 생성한다. std::variant v{}; v = 42; //'int' 형 에 대입 v = "Hyojin" // 문자열 string 에 대입 v = 3.14 // 'double' 대입 int tmp = std::get(v); // 값에 직접 접근한다 (참조형으로 return) int pTmp = std::get..