어댑터 패턴을 완벽하게(?) 이해를 했다면 이제는 브릿지 패턴으로 가자.
어댑터처럼 자주 사용되는 녀석은 아니지만 그래도 그 성격상 어댑터와 아주 닮은 부분이 많기 때문에 어댑터만 이해를 했다면 브릿지도 그렇게 어렵지만은 않을 것이라 생각한다.
브릿지라는 말에서도 알 수가 있듯이 어댑터와 어째 어감이 상당히 비스무리 하다.
뭔가 연결시켜주는 듯한 느낌이라고 할까? 해서 브릿지도 어댑터가 가진 UML과 비슷한 부분들이 많다.
헉 완죤히 다르다구요... 음... 그래도 근본적인 부분은 비슷한 것 같아요. 뭐 다르다면 어쩔 수 없구요. 하지만 제가 이해한 것을 중심으로 적으니까요 넘 뭐라고 하지 마세요.. 흑흑~~~
위의 클래스다이어그램에서 Implementor클래스를 클라이언트가 그냥 사용해도 무관합니다. 하지만 Abstraction이라는 중간 다리(음...)를 이용해서 한단계 걸쳐서 사용을 합니다. 물론 확장성을 고려한 부분이죠. Implementor를 이용해서 ConcreteImplementorA, B, C등등 복사본을 많이 만들수 있지만 직접 클라이언트에서 사용을 하게 되면 확장성에 대한 문제가 발생을 하게 되겠죠... 때문에 Abstractor클래스를 하나 두고 이 클래스를 다시 상속받은 RefinedAbstraction클래스에서 Implementor를 이용한다면 Implementor를 이용한 다양한 RefinedAbstraction클래스를 만들 수 있습니다.
물론 클라이언트에는 그다지 큰 영향이 안가겠죠 ㅎㅎ
또한 원하는 ConcreteImplementor의 형을 지정해서 필요한 클래스만을 사용할 수도 있습니다.
이렇게 가능한 것은 Abstraction에서 Implementor의 멤버를 가지고 있기 때문입니다.
아래에 소스를 퍼 놓았습니다.
// Bridge pattern -- Structural example
|
using System;
namespace DoFactory.GangOfFour.Bridge.Structural { // MainApp test application class MainApp { static void Main() { Abstraction ab = new RefinedAbstraction(); // Set implementation and call ab.Implementor = new ConcreteImplementorA(); ab.Operation(); // Change implemention and call ab.Implementor = new ConcreteImplementorB(); ab.Operation(); // Wait for user Console.Read(); } } // "Abstraction" class Abstraction { protected Implementor implementor; // Property // 이 부분이 핵심이다.
여기서 사용하고자 하는 Implementator의 자식 클래스들을
//
할당해서 RefinedAbstraction클래스에서 사용한다.
public Implementor Implementor { set{ implementor = value; } } public virtual void Operation() { implementor.Operation(); } } // "Implementor" abstract class Implementor { public abstract void Operation(); } // "RefinedAbstraction" class RefinedAbstraction : Abstraction { // 추상클래스를 재정의해서
사용한다.
public override void Operation() { implementor.Operation(); } } // "ConcreteImplementorA" class ConcreteImplementorA : Implementor { // Implementor를
상속받아서 각 클래스 별로
// 내부적인 기능에
관련된 부분에 대해 적용이 가능하다.
// 하지만, RefinedAbstraction에서 호출하는 Operation()함수에 대해서는 달라지면
안된다. public override void Operation() { Console.WriteLine("ConcreteImplementorA Operation"); } } // "ConcreteImplementorB" class ConcreteImplementorB : Implementor { public override void Operation() { Console.WriteLine("ConcreteImplementorB Operation"); } } } |
'OOP거듭나기' 카테고리의 다른 글
구조패턴 - Decorator패턴 (0) | 2007.07.26 |
---|---|
구조패턴 - Facade 패턴 (0) | 2006.09.26 |
구조패턴 - 컴포지트 패턴 (0) | 2006.09.26 |
구조패턴 - Adapter 패턴 (0) | 2006.09.23 |
OOP 거듭나기를 시작하면서... (0) | 2006.09.22 |