반응형

구조패턴 4

퍼사드 패턴(Façade Pattern)

Façade는 프랑스어로 "출입구가 있는 건물의 앞부분을 의미합니다" 즉, 복잡한 부분은 뒤로 숨기고 간략화된 인터페이스를 제공하는 패턴입니다. 퍼사드 디자인 패턴은 하나 이상의 복잡한 서브 시스템 앞에 단순한 인터페이스를 두기 위한 방법입니다. 퍼사드는 편리하고 직관적인 API를 통해 이용할 수 있게합니다. class Engine { public: void Start() { ... } }; class Headlights { public: void TurnOn() { ... } }; // facade class Car { public: void Start() { headlights.TurnOn(); engine.Start(); } private: Engine engine; Headlights headli..

데커레이터 패턴(Decorator Pattern)

동료가 작성한 코드의 원본을 수정하지 않고 기능을 확장하는 방법은? 가장 쉽게 생각나는 것이 "상속"을 이용하는 것입니다. 데커레이터 패턴은 이미 존재하는 타입에 새로운 기능을 추가하면서도 원래 타입의 코드에 수정을 피할 수 있게 해줍니다. (OCP 준수) Shape을 상속 받아 ColoredShape과 TransparentShape을 추가하고 두 기능이 모두 필요하여 ColoredTransparentShape을 만들었습니다. 이렇게 상속의 방법으로 기능을 추가 한다면 Shape의 기능이 들어 나거나 도형이 추가된다면 클래스가 점점 수도 없이 늘어나야만 합니다. Square, Circle 등과 같은 도형추가 되거나 크기 조절 가능 기능을 추가되는 것을 상상해 봅시다. 평범한 상속으로는 효율적으로 원본을 ..

컴포지트 패턴(Composite Pattern)

컴포지트 패턴은 어떤 객체들의 집합에 대해 개별 인터페이스를 동일하게 가져갈 수 있게하는 것입니다. 배열에 기반한 속성 크리처의 속성을 배열로 구현하면 작성하기 쉽고 유지 보수 하기도 쉽다. 힘, 민첩, 지능을 가지는 크리쳐의 능력 들의 통계를 내는 구현입니다. struct Creature { int strength, agility, intelligence; int sum() const { return strength + agility + intelligence; } double average() const { return sum()/3.0; } int max() const { return max(max(strength, agility), intelligence); } } 크리처의 속성이 늘어 날때 마다..

브릿지 패턴(Bridge Pattern)

기능 클래스(껍데기)와 구현 클래스(실제 구현)를 서로 연결하는 패턴입니다. Bridge하면 무엇이 떠오르나요? 브릿지가 서로 떨어진 두 곳을 연결 하듯이 브릿지 패턴 또한 서로 떨어진 두 기능을 연결합니다. 이것이 핵심입니다. 즉, 기능과 구현을 서로 연결하는 것입니다. Pimpl(Pointer to Implementation) 관례 구현부를 포인터로 참조하는 관례를 뜻한다. 클래스의 구현부를 다른 클래스(PersonImpl)에 숨깁니다. PersonImpl 구현이 모두 .cpp 파일에 정의하는 것이 핵심입니다. Person.h struct Person { std::string name; class PersonImpl; // 전방 선언 PersonImpl *impl; // 구현은 모두 cpp 파일에서 ..

반응형