[구조 패턴] - 파사드(Facade) 구조 #pragma once #include class ClassA { public: void Operate() { std::cout OperateClassC(); return 0; } 파사드 객체는 클라이언트를 대신하여 객체들과 상호 작용하며, 객체들을 통합시킨 간략한 인터페이스를 클라이언트에게 제공한다. 클라이언트가 내부 구조에 의존하지 않고 파사드 객체를 통해 객체 구조를 제어할 수가 있어 코드의 유연성이 향상된다. 프로그래밍/GoF 2022.01.11
[구조 패턴] - 데코레이터(Decorator) 구조 #pragma once #include class IComponent { public: virtual void Operate() = 0; }; class Component : public IComponent { public: void Operate() override { std::cout 프로그래밍/GoF 2022.01.11
[구조 패턴] - 컴포지트(Composite) 구조 #pragma once #include #include #include class IComponent { public: virtual void Operation() = 0; }; class Composite : public IComponent { Composite() { } void Operation() override { for (IComponent* component : components_) { component->Operation(); } } void Add(IComponent* component) { components_.push_back(component); } private: std::vector components_; }; class Leaf : public IComponent { p.. 프로그래밍/GoF 2022.01.11
[구조 패턴] - 브릿지(Bridge) 구조 #pragma once #include class IImplementor { public: virtual void OperationImpA() = 0; virtual void OperationImpB() = 0; }; class ImplementorA : public IImplementor { public: void OperationImpA() { std::cout 프로그래밍/GoF 2022.01.10
[구조 패턴] - 어댑터(Adapter) 구조 #pragma once #include class IAdapter { public: virtual void OperateAdapter() = 0; }; class Adaptee { public: void OperateAdaptee() { std::cout OperateAdapter(); return 0; } 클래스에 인터페이스를 직접 구현하는것도 방법이지만, 그것은 SOLID의 개방-폐쇄의 원칙에 어긋나기도 하고 라이브러리를 사용하는 경우 수정이 불가능하기도 하다. 클래스(Adaptee)와 인터페이스(IAdapter) 사이에 어댑터의 개념을 가진 클래스(ImplementationAdapter)를 만들어 클라이언트에게 클래스에 대한 인터페이스를 제공한다. 클라이언트는 클래스와 연결된 어댑터를 인터페이.. 프로그래밍/GoF 2022.01.10
[행동 패턴] - 템플릿 메서드(Template method) 구조 #pragma once #include class BaseClass { public: virtual void operation1() = 0; virtual void operation2() = 0; void templateFunction() { operation1(); std::cout 프로그래밍/GoF 2022.01.09
[행동 패턴] - 방문자(Visitor) 구조 #pragma once #include class IVisitor; class BaseClass { public: virtual void accept(IVisitor* visitor) = 0; }; class DerivedClassA : public BaseClass { public: void accept(IVisitor* visitor) override { visitor->visitElementA(this); } void operationA() { std::cout accept(visitor); classB->accept(visitor); system("pause"); return 0; } 객체(DerivedClass)에 대한 알고리즘(accept function)을 객체의 구조로부터 분리하여 방.. 프로그래밍/GoF 2022.01.09
[행동 패턴] - 전략(Strategy) 구조 #pragma once #include #include #include class Strategy { public: virtual int algorithmInterface(int a, int b) = 0; }; class Context { private: Strategy* strategy_; public: Context(Strategy* strategy) { strategy_ = strategy; } void changeStrategy(Strategy* strategy) { strategy_ = strategy; } void contextInterface() { std::cout algorithmInterface(5, 5) contextInterface(); context->changeStrateg.. 프로그래밍/GoF 2022.01.08
[행동 패턴] - 상태(State) 구조 #pragma once #include #include #include class State { public: virtual void handle() = 0; }; class Context { private: State* state_; public: Context(State* state) { state_ = state; } void changeState(State* state) { state_ = state; } void request() { state_->handle(); } }; class StateA : public State { public: void handle() override { std::cout changeState(stateB); context->request(); system(".. 프로그래밍/GoF 2022.01.08
[행동 패턴] - 감시자(Observer) 구조 #pragma once #include #include #include class Observer { public: virtual void update() = 0; }; class Subject { private: std::set observers_; public: void attach(Observer* observer) { observers_.insert(observer); } void detach(Observer* observer) { observers_.erase(observer); } void notify() { for (Observer* observer : observers_) { observer->update(); } } }; class ConcreteSubject : public Sub.. 프로그래밍/GoF 2022.01.08