프로그래밍/GoF

[구조 패턴] - 브릿지(Bridge)

MAKGA 2022. 1. 10. 23:09
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