반응형
Bridge Pattern (가교 패턴)
목적
추상적 개념에 해당하는 클래스 계통(Abstraction)과 구현에 해당하는 클래스 계통(Implementor)을 분리한다.
상속을 통한 구현은 구현과 추상적 개념을 영구적으로 종속시키기 때문에 수정, 확장이 쉽지 않다.
따라서 가교 패턴을 통해 수정, 확장의 용이점을 갖는다.
사용 시나리오
- 태블릿 디바이스가 9인치, 11인치, 13인치를 개발한다고 가정한다.
- 각 태블릿 마다 화면을 디스플레이한다는 공통점은 있지만 세로와 가로길이에 따라 구체적인 디스플레이 방법은 다르며 이를 각각 구현해야 한다.
[Implementor]
class DisplayImpl { //Implementor
public:
virtual void showDisplay() = 0;
virtual void setHeight() = 0;
virtual void setWidth() = 0;
};
[ConcreteImplementor]
class Tablet9DisplayImpl : public DisplayImpl { //ConcreteImplementor
public:
virtual void showDisplay() override final {
cout<<"show 9 Inches tablet"<<endl;
}
virtual void setHeight() override final {
cout<<"set for 9 Inches tablet height"<<endl;
}
virtual void setWidth() override final {
cout<<"set for 9 Inches tablet weight"<<endl;
}
};
class Tablet11DisplayImpl : public DisplayImpl { //ConcreteImplementor
public:
virtual void showDisplay() override final {
cout<<"show 11 Inches tablet"<<endl;
}
virtual void setHeight() override final {
cout<<"set for 11 Inches tablet height"<<endl;
}
virtual void setWidth() override final {
cout<<"set for 11 Inches tablet weight"<<endl;
}
};
class Tablet13DisplayImpl : public DisplayImpl { //ConcreteImplementor
public:
virtual void showDisplay() override final {
cout<<"show 13 Inches tablet"<<endl;
}
virtual void setHeight() override final {
cout<<"set for 13 Inches tablet height"<<endl;
}
virtual void setWidth() override final {
cout<<"set for 13 Inches tablet weight"<<endl;
}
};
[Abstraction]
class TabletDisplay { //Abstraction
public:
TabletDisplay(DisplayImpl* displayImpl) {
this->displayImpl = displayImpl;
}
void setTabletDisplayImpl(DisplayImpl* displayImpl) {
this->displayImpl = displayImpl;
}
void show() {
displayImpl->showDisplay();
}
void setWidth() {
displayImpl->setWidth();
}
void setHeight() {
displayImpl->setHeight();
}
private:
DisplayImpl* displayImpl;
};
[ConcreteAbstraction]
class GalaxyTabDisplay : public TabletDisplay { //ConcreteAbstraction
public:
GalaxyTabDisplay(DisplayImpl* displayImpl) : TabletDisplay(displayImpl){
}
void showMyDisplay() {
setWidth();
setHeight();
show();
}
};
[사용 예]
int main(int argc, const char * argv[]) {
GalaxyTabDisplay* myTablet = new GalaxyTabDisplay(new Tablet9DisplayImpl());
myTablet->showMyDisplay();
myTablet->setTabletDisplayImpl(new Tablet11DisplayImpl());
myTablet->showMyDisplay();
myTablet->setTabletDisplayImpl(new Tablet13DisplayImpl());
myTablet->showMyDisplay();
return 0;
}
실행결과
set for 9 Inches tablet weight
set for 9 Inches tablet height
show 9 Inches tablet
set for 11 Inches tablet weight
set for 11 Inches tablet height
show 11 Inches tablet
set for 13 Inches tablet weight
set for 13 Inches tablet height
show 13 Inches tablet
반응형
'Design Patterns > Structural Patterns' 카테고리의 다른 글
Flyweight Pattern (C++) (0) | 2019.11.09 |
---|---|
Facade Pattern (C++) (0) | 2019.10.27 |
Decorator Pattern (C++) (0) | 2019.07.21 |
Composite Pattern (C++) (0) | 2019.04.21 |
Adapter Pattern (C++) (0) | 2019.03.03 |