1. 브리지 패턴이란?
브리지 패턴은 두 개의 독립적인 개념을 연결(Bridge)해 서로의 변화에 영향을 덜 받게 만드는 구조적 디자인 패턴입니다. 일반적으로 추상화와 구현을 분리해 독립적으로 확장할 수 있도록 설계합니다. 이 패턴은 코드의 확장성과 유지보수성을 높이는 데 유용합니다. 🎯
특징
- 추상화와 구현의 독립성 유지
- 런타임에 구현을 바꿀 수 있는 유연성 제공
- 다형성을 활용한 깔끔한 구조
2. 브리지 패턴의 구성 요소
브리지 패턴은 크게 4가지 구성 요소로 이루어집니다:
- Abstraction (추상화)
- 기능의 상위 레벨을 정의한 인터페이스 또는 추상 클래스
- Refined Abstraction (구체화된 추상화)
- 추상화를 확장한 구체적인 클래스
- Implementor (구현자)
- 실제 기능을 수행하는 인터페이스
- Concrete Implementor (구체 구현자)
- 구현자 인터페이스를 실제로 구현한 클래스
구조 다이어그램
3. 브리지 패턴 예제
문제 상황
게임 아이템을 화면에 표시할 때, 무기 종류와 효과(예: 불, 얼음 등)를 조합해야 한다고 가정해봅시다.
브리지 패턴을 활용해 조합 가능한 클래스 수를 줄이고 유연성을 높이는 구조를 설계해 보겠습니다. 💡
코드 예제
// Implementor
public interface IEffect
{
void ApplyEffect(string weapon);
}
// Concrete Implementors
public class FireEffect : IEffect
{
public void ApplyEffect(string weapon)
{
Debug.Log($"{weapon}에 불 효과를 적용합니다.");
}
}
public class IceEffect : IEffect
{
public void ApplyEffect(string weapon)
{
Debug.Log($"{weapon}에 얼음 효과를 적용합니다.");
}
}
// Abstraction
public abstract class Weapon
{
protected IEffect effect;
public Weapon(IEffect effect)
{
this.effect = effect;
}
public abstract void Use();
}
// Refined Abstraction
public class Sword : Weapon
{
public Sword(IEffect effect) : base(effect) { }
public override void Use()
{
Debug.Log("검을 휘두릅니다.");
effect.ApplyEffect("검");
}
}
public class Bow : Weapon
{
public Bow(IEffect effect) : base(effect) { }
public override void Use()
{
Debug.Log("활을 쏩니다.");
effect.ApplyEffect("활");
}
}
// 사용 예시
public class Game
{
public static void Main()
{
IEffect fireEffect = new FireEffect();
IEffect iceEffect = new IceEffect();
Weapon sword = new Sword(fireEffect);
sword.Use(); // 출력: 검을 휘두릅니다. 검에 불 효과를 적용합니다.
Weapon bow = new Bow(iceEffect);
bow.Use(); // 출력: 활을 쏩니다. 활에 얼음 효과를 적용합니다.
}
}
4. 브리지 패턴의 사용 시 고려할 점
장점 ✨
- 확장성 증가: 추상화와 구현을 독립적으로 확장할 수 있습니다.
- 코드 중복 감소: 조합 가능한 클래스 수를 줄입니다.
- 유연성 제공: 런타임에 구현을 바꿀 수 있습니다.
주의점 ⚠️
- 설계가 복잡해질 수 있으므로, 모든 상황에 적합하지 않습니다.
- 추상화와 구현이 지나치게 단순하다면, 오히려 불필요한 구조가 될 수 있습니다.
5. 결론
브리지 패턴은 추상화와 구현을 분리해 서로 독립적으로 확장할 수 있도록 돕는 강력한 디자인 패턴입니다. 특히, 조합 가능한 객체가 많아질 때 설계의 복잡도를 줄이고 코드의 유연성을 높이는 데 효과적입니다. 하지만 과도하게 사용하면 불필요한 복잡성을 초래할 수 있으므로 적절한 상황에서 활용하는 것이 중요합니다. 🚀
6. 관련 링크
반응형
'Workspace > Design Pattern' 카테고리의 다른 글
방문자 패턴 (Visitor Pattern): 유연한 확장을 돕는 디자인 패턴 (0) | 2025.01.24 |
---|---|
책임 연쇄 패턴 (Chain of Responsibility): 요청 처리의 유연한 흐름 만들기 (0) | 2025.01.24 |
컴포지트 패턴 (Composite Pattern): 객체를 트리 구조로 구성하여 복잡성을 줄이기 (0) | 2025.01.22 |
상태 패턴 (State Pattern): 객체의 상태에 따라 행동을 다르게 구현하기 (2) | 2025.01.22 |
플라이웨이트 패턴 (Flyweight Pattern): 메모리 절약을 위한 객체 재사용 설계 (0) | 2025.01.22 |