320x100
구조
#pragma once
#include <iostream>
class IImplementor
{
public:
virtual void OperationImpA() = 0;
virtual void OperationImpB() = 0;
};
class ImplementorA : public IImplementor
{
public:
void OperationImpA()
{
std::cout << "Operating A in ImplementerA" << std::endl;
}
void OperationImpB()
{
std::cout << "Operating B in ImplementerA" << std::endl;
}
};
class ImplementorB : public IImplementor
{
public:
void OperationImpA() override
{
std::cout << "Operating A in ImplementerB" << std::endl;
}
void OperationImpB() override
{
std::cout << "Operating B in ImplementerB" << std::endl;
}
};
class IAbstraction
{
public:
virtual void Operation() = 0;
};
class AbstractionA : public IAbstraction
{
public:
AbstractionA(IImplementor* implementor)
{
implementor_ = implementor;
}
void Operation() override
{
implementor_->OperationImpA();
}
private:
IImplementor* implementor_;
};
class AbstractionB : public IAbstraction
{
public:
AbstractionB(IImplementor* implementor)
{
implementor_ = implementor;
}
void Operation() override
{
implementor_->OperationImpB();
}
private:
IImplementor* implementor_;
};
사용
int main()
{
std::vector<IAbstraction*> abstractions =
{
new AbstractionA(new ImplementorA()),
new AbstractionA(new ImplementorB()),
new AbstractionB(new ImplementorA()),
new AbstractionB(new ImplementorB()),
};
for (IAbstraction* abstraction : abstractions)
{
abstraction->Operation();
}
return 0;
}
상위 클래스의 기능을 확장하기 위해 상속하여 추상 계층을 형성하는 것과, 상위 클래스의 기능을 구현하기 위해 상속하여 구현 계층을 형성할 수가 있다. 그러나, 이 두가지 의도로 클래스를 복합적으로 상속해나갈 경우, 추상 계층과 구현 계층이 뒤섞여 확장하는데에 어려움이 발생할 것이다.
그래서 브릿지 패턴은 이 두 계층을 개별적인 클래스로 나누게 되며, 교량이 두 지점을 잇듯이 추상 계층(Abstraction)이 구현 계층(Implementor)을 참조하여 연결한다. 그리하여 추상 계층과 구현 계층은 각자 독립적으로 확장할 수 있게 되고, 추상 계층은 구현 계층의 인터페이스를 가지고 구현 계층에 대한 지시를 정의하게 되어 구현에 대한 의존성을 분리하였다.
320x100
'프로그래밍 > GoF' 카테고리의 다른 글
[구조 패턴] - 데코레이터(Decorator) (0) | 2022.01.11 |
---|---|
[구조 패턴] - 컴포지트(Composite) (0) | 2022.01.11 |
[구조 패턴] - 어댑터(Adapter) (0) | 2022.01.10 |
[행동 패턴] - 템플릿 메서드(Template method) (0) | 2022.01.09 |
[행동 패턴] - 방문자(Visitor) (0) | 2022.01.09 |