Bridge

2022. 3. 7. 00:00CSharp/Design Pattern

반응형

큰 클래스 또는 밀접하게 관련된 클래스 집합을 서로 독립적으로 개발할 수 있는 두 개의 개별 계층(추상화 및 구현)으로 분할할 수 있는 구조적 디자인 패턴.

 

기능 클래스 계층 ||=========|| 구현클래스 계층

 

참조 : https://refactoring.guru/design-patterns/bridge

 

전사와 도적이 존재 한다고 하자

전사가 대검으로 공격 할 수도 있고 단검으로 공격 할 수도 있다.

도적이 대검으로 공격 할 수도 있고 단검으로 공격 할 수도 있다.

각각을 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 의 복잡성을 해결 하였다.

 

 

관련영상

https://youtu.be/scWQv8i9ISo

 

반응형

'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