Bridge
2022. 3. 7. 00:00ㆍCSharp/Design Pattern
반응형
큰 클래스 또는 밀접하게 관련된 클래스 집합을 서로 독립적으로 개발할 수 있는 두 개의 개별 계층(추상화 및 구현)으로 분할할 수 있는 구조적 디자인 패턴.
기능 클래스 계층 ||=========|| 구현클래스 계층
전사와 도적이 존재 한다고 하자
전사가 대검으로 공격 할 수도 있고 단검으로 공격 할 수도 있다.
도적이 대검으로 공격 할 수도 있고 단검으로 공격 할 수도 있다.
각각을 class 로 구성 하려만 아래와 같이 서로 다른 4개의 class 로 구성된다.
- 전사+대검
- 전사+단검
- 도적+대검
- 도적+단검
이 상황에서 쌍검이 라는 새로운 무기를 추가 하려면 어떻게 될까?
또 직업중 암살자가 추가된다면 어떻게 해야 할까?
이런 상황을 위에 bridge 패턴을 이용하여 해결해 보자
Abstraction 에 해당 하는 Unit 과 Refined Abstraction 에 해당 하는 직업들
(IWeapon 이라는 Implementation 을 포함 하고 있음)
public abstract class Unit
{
protected IWeapon _weapon;
public Unit(IWeapon weapon) => _weapon = weapon;
public abstract void Attack();
}
public class Warrior : Unit
{
public Warrior(IWeapon weapon) : base(weapon) { }
public override void Attack()
{
Console.Write("전사가 ");
_weapon.Attack();
}
}
public class Rogue : Unit
{
public Rogue(IWeapon weapon) : base(weapon) { }
public override void Attack()
{
Console.Write("도적이 ");
_weapon.Attack();
}
}
public class Assassin : Unit
{
public Assassin(IWeapon weapon) : base(weapon) { }
public override void Attack()
{
Console.Write("암살자가 ");
_weapon.Attack();
}
}
Implementation 에 해당 하는 IWeapon 과 concrete implementation 에 해당하는 무기들
public interface IWeapon
{
void Attack();
}
public class BastardSword : IWeapon
{
public void Attack() => Console.WriteLine("대검으로 베기!!");
}
public class Dagger : IWeapon
{
public void Attack()=> Console.WriteLine("단검으로 찌르기!!");
}
public class DoubleSword : IWeapon
{
public void Attack() => Console.WriteLine("쌍검으로 연속베기!!");
}
사용법
Unit unit = new Warrior(new BastardSword());
unit.Attack();
unit = new Rogue(new Dagger());
unit.Attack();
unit = new Assassin(new DoubleSword());
unit.Attack();
// output
전사가 대검으로 베기!!
도적이 단검으로 찌르기!!
암살자가 쌍검으로 연속베기!!
bridge 는 이와 같이 복잡한 class 를 두 그룹으로 분류 하여
하나는 추상화(unit.attack)
다른 하나는 구체화(weapon.attack)
하여 추상화 클래스가 구체화 클래스를 포함(composit) 하여 class 의 복잡성을 해결 하였다.
관련영상
반응형
'CSharp > Design Pattern' 카테고리의 다른 글
Flyweight (0) | 2022.03.11 |
---|---|
Facade (0) | 2022.03.10 |
Decorator (0) | 2022.03.09 |
Composite (0) | 2022.03.08 |
Adapter (Structural Pattern) (0) | 2022.02.28 |