7. 3 디자인
가교 패턴에 대해 설명하기 위한 예제 프로그램은 카메라와 렌즈, 모듈로 구성할게요. 그리고 렌즈는 AF 렌즈와 MF 렌즈, 모듈은 VR 모듈과 PC 모듈을 정의할게요.
카메라는 내부에 렌즈를 가지고 있는 클래스로 가교 패턴과는 연관성이 없습니다. 가교 패턴에서의 추상화 부분은 렌즈, AF 렌즈, MF 렌즈입니다. 그리고 구체적 구현 부분은 모듈과 VR 모듈, PC 모듈이 있습니다. 가교 패턴을 적용하지 않으면 기반 클래스 렌즈에서 파생한 AF 렌즈, MF 렌즈가 있고 AF 렌즈에서 파생한 AF VR 렌즈, AF PC렌즈, AF VR PC렌즈가 있게 됩니다. 물론, MF 렌즈에서 파생된 MF VR 렌즈와 MF PC렌즈, MF VR PC렌즈가 존재하게 될 것입니다. 여기에 새로운 모듈이 추가된다고 하면 가교 패턴을 적용할 때 모듈 클래스에서 파생된 클래스를 하나 추가하면 되지만 적용하지 않았을 때에는 추가해야 할 파생 클래스의 개수는 많아질 것입니다. 또한, 렌즈에서 파생한 클래스를 추가해도 가교 패턴은 렌즈 클래스에서 파생된 클래스를 하나 추가하면 되지만 적용하지 않았을 때에는 추가해야 할 파생 클래스의 개수는 많아질 것입니다.
카메라 클래스의 이름은 Camera로 정하고 렌즈를 장착할 수 있게 제공할 것입니다.
렌즈 클래스는 피사체를 사진으로 변환하는 추상 메서드가 선언된 Lens 이름의 추상 클래스로 정의할게요. 그리고 렌즈에는 모듈을 장착할 수 있는 기능을 제공을 합시다. 그리고 모듈의 공통적 기능에 대한 약속을 IImageProcessing 인터페이스를 정의하고 이를 기반으로 VR 모듈과 PC 모듈을 제공합니다.
이처럼 Lens 클래스에서 파생한 AFLens와 MFLens는 어떠한 모듈을 장착하는가에 따라 실제 수행할 수 있는 기능이 확장됩니다. 가교 패턴을 사용하면 기능에 대한 구체적 구현을 개체화할 수 있어서 파생 클래스가 많아지는 것을 피할 수도 있으며 단위 기능을 추가하거나 변경, 삭제 등의 유지보수 비용을 줄일 수 있습니다.