Language/C++ Design Pattern (11) 썸네일형 리스트형 Bridge 패턴 브리지의 목적은 구현 상세 일부를 추상화 뒤로 캡슐화해 물리적 의존성을 최소화 하는 것이다. 의도: ' 추상화를 그 구현과 분리해 그 둘이 독립적으로 달라질 수 있게 한다.' 브리지 디자인 패턴은 장반대인 것을 다룬다 즉, 함께 작동해야 하지만 서로에 대해 너무 많은 상세 내용을 알아서는 안되는 두 기능이 적당한 거리를 유지하며 물리적 의존성을 줄일 수 있게 지원하며 분리를 돕는다. 예시로 자동차를 구현해야한다고 하자. 자동차는 필수로 engine이 필요하기 때문에, 역시 engine 클래스도 같이 들어간다.#inlcude class SedanCar{ public: SedanCar(/* ... */) void drive(); // ... private: Gasoli.. 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;cl.. 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.. Visitor 패턴 (C++ 소프트웨어 디자인 책 정리) 비지터 디자인 패턴은 GoF 서술한 고전적인 디자인 패턴 중 하나다. 타입보다는 연산을 자주 추가할 수 있게 하는데 중점을 둔다.비지터 패턴의 의도는 객체 구조의 요소에 대해 수행할 연산을 나타낸다. 비지터를 사용하면 연산 대상 요소의 클래스를 변경하지 않고 새 연산을 정의할 수 있다. 아래 shape의 상송 계통을 보자 위 UML 에서 Shape클래스는 특정 도형에 대한 기초 클래스다. 지금 예에서는 Circle, Square, Trapezoid 클래스가 있다. 위 구조를 가지고 유지보수를 하던 중 새로운 연산 'rotate 함수' 를 구현해야 한다고 하자. Shape 클래스에 'rotate'연산을 추가하고 직접 정의한 파생 타입은 약간의 추가 노력으로 훌훌 털어.. DIP 원칙 의존성 역전 원칙(Dependency Inversion Principle, DIP) (C++ 소프트웨어 디자인 책 정리)가장 유연한 시스템은 소스 코드 의존성이 구체화(concretion)가 아닌 추상화만 참조하는 시스템이다. 이 원칙은 의존성을 위해 구체 타입이나 구현 상세 대신 추상화에 의존할 것을 조언한다.상속 계통에 대해서는 아무 말도 하지 않고 일반적인 추상화만 언급한다. 지금부터 자동 입출금기(ATM)의 논리를 구현한다고 생각해보자. ATM은 인출, 입금, 송금 등 여러가지 연산을 제공한다. 이 모든 연산은 실제 돈을 다루므로 완전히 완료하거나 오류가 있으면 중단하고 모든 변경을 되돌려야 한다. 이런 행위를 일반적으로 transaction 이라고 한다.결과적으로 Transaction이라는 추.. LSP 원칙 리스코프 치환 원칙 (C++ 소프트웨어 디자인 책 정리)하위 타입(subtype) 요구 사항: ψ(x) 를 T 타입 객체 x에 대해 증명할 수 있는 특성이라 하자. 이 때 S가 T의 하위 타입이라면 ψ(y)는 S 타입 객체 y에 대해 참이어야한다. LSP는 세 번쨰 SOLID원칙이며 행위적 서브타이핑, 즉 추상화로 기대하는 행위와 관련이 있다.이 원칙은 흔히 IS-A 관계라고 하는 것을 공식화 한다. 이 관계, 즉 추상화의 기대를 하위타입에서 반드시 따라야 한다.Struct X{ virtual ~X() = default; // 사전 조건: 함수는 0보다 큰 모든 'i'를 받아들인다 virtual void f( int i) const { assert(i > 0); // ... }};.. 이전 1 2 다음