Thinking Different






Bridge Pattern - 브리지 패턴


  • 구현부에서 추상층을 분리하여 각자 독립적으로 변형할 수 있게 하는 패턴이다.
  • 즉, 기능과 구현을 별도의 클래스로 정의해서 서로를 분리하는 방법이다
  • 전형적인 상속을 이용한 패턴으로 확장 설계에 용이하다







샘플코드)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//------------------------------------------------------------------
// Implementor 인터페이스
class Implementor
{
public:
    virtual void operationImpl() = 0;
};
 
//------------------------------------------------------------------
// ConcreteImplementorA 상속 클래스
class ConcreteImplementorA : public Implementor
{
public:
    void operationImpl() { cout << "ConcreteImplementorA" << endl; }
};
 
//------------------------------------------------------------------
// ConcreteImplementorB 상속 클래스
class ConcreteImplementorB : public Implementor
{
public:
    void operationImpl() { cout << "ConcreteImplementorB" << endl; }
};
 
//------------------------------------------------------------------
// Abstraction 인터페이스
class Abstraction
{
public:
    virtual void operation() = 0;
};
 
//------------------------------------------------------------------
// ConcreteAbstraction 상속 클래스
class ConcreteAbstraction : public Abstraction
{
public:
    ConcreteAbstraction(Implementor* i) : impl(i) {}
 
public:
    void operation() { impl->operationImpl(); }
 
private:
    Implementor* impl;
};
 
//------------------------------------------------------------------
// Main
int _tmain(int argc, _TCHAR* argv[])
{
    ConcreteImplementorA pConcreteImplementorA;
    ConcreteImplementorB pConcreteImplementorB;
 
    ConcreteAbstraction mConcreteAbstractionA(&pConcreteImplementorA);
    ConcreteAbstraction mConcreteAbstractionB(&pConcreteImplementorB);
 
    mConcreteAbstractionA.operation();
    mConcreteAbstractionB.operation();
 
    return 0;
}




예제를 통한 브리지 패턴(Bridge Pattern) 알아보기





사람이라는 추상화 객체를 각각 요리하는 사람과 청소하는 사람으로 나누기 위해 각각의 구현을 작업이라는 인터페이스를 통해 별도로 분리하였다.


예제 코드)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/** "Implementor" */
class 작업
{
public:
    virtual void 처리() = 0;
};
 
/** "ConcreteImplementor" 1/2 */
class 요리 : public 작업
{
public:
    void 처리() override
    {
        std::cout << "요리를 합니다" << std::endl;
    }
};
 
/** "ConcreteImplementor" 2/2 */
class 청소 : public 작업
{
public:
    void 처리() override
    {
        std::cout << "청소를 합니다" << std::endl;
    }
};
 
/** "Abstraction" */
class 사람
{
public:
    virtual void 처리() = 0;
};
 
/** "Concrete Abstraction" 1/2 */
class 요리사 : public 사람
{
public:
    요리사(작업* i) : pProcess(i) {}
 
    void 처리() override
    {
        pProcess->처리();
    }
 
private:
    작업 * pProcess;
};
 
/** "Concrete Abstraction" 2/2 */
class 청소부 : public 사람
{
public:
    청소부(작업* i) : pProcess(i) {}
 
    void 처리() override
    {
        pProcess->처리();
    }
 
private:
    작업 * pProcess;
};
 
 
int main()
{
    작업* pCook = new 요리();
    작업* pClean = new 청소();
 
    사람* pCooker = new 요리사(pCook);
    사람* pCleaner = new 청소부(pClean);
 
    pCooker->처리();
    pCleaner->처리();
 
    delete pCook;
    delete pClean;
 
    delete pCooker;
    delete pCleaner;
 
    return 0;
}


예제 결과)