http://www.codeproject.com/gen/design/bridge.asp
이번엔 Pimple idiom의 본체가 되는 Bridge pattern입니다. Pimple idiom의 경우엔, compilation unit을 별도로 만들어주는게 아무래도 주 목적이 되는 테크닉적인 내용이지만, bridge pattern은 추상과 구현을 분리하는게 목적입니다.
예를들어, 클라이언트는 단지 이미지에대한 보여주기/읽어오기의 기능에 대한 추상개념만 갖고 있다고 하겠습니다. 그러나 이미지는 BMP와 JPG로 분리될 수 있겠죠. 그러면, 이 두가지를 추상화 시켜서 관리해야합니다. 동시에, ‘보여주기’, ‘불러오기’ 부분은 윈도우와 OS/2가 다르겠죠. 바로 이런 경우에 사용되는게 브리지 패턴입니다. UML은 아래와 같습니다.
간략히 설명하면, CBmpImage와 CJpegImage는 CImage를 구현합니다. 또, 그림을 실제로 불러오고 저장하는 부분은 CImageImp가 담당하게 되는데, 이 때 CImageImp는 CWinImp와 COS2Imp 로 운영체제별 클래스가 있습니다. 클라이언트는 CImage만 접근 가능합니다.
클라이언트는 가령 이런식이겠죠.
CImage img = CImgFactory.create(“abcd.bmp”);
그러면, 팩토리에서는 파일명을 보고 CBmpImage를 반환합니다. 이 때, 운영체제를 자동으로 판별해서 CBmpImage::set_implementation(new CWinImpl()); 과 같이 호출을 해주겠죠.. 그러면, 사용자는 img를 얻었으니까 img.show(); 로 이미지를 보겠다고 합니다. 그러면 CBmpImage 에서 필요한 전처리를 한 뒤, CWinImpl::PaintImage() 를 호출해줍니다.
이 때, CBmpImage와 CJpegImage가 분리되어있는 이유는 추상화 부분(CImage)에 대해서도 refined abstraction을 제공하기 위함입니다.