Bridge 패턴

5.디자인패턴 2016. 9. 13. 19:32

Bridge 패턴은 두 구체 클래스 간의 강한 결합을 제거하기 위해서 사용하는 패턴이다. 특히 두 클래스 모두 추상화된 상위 클래스 또는 인터페이스(= 타입)를 가지게 되고, 의존성은 상위 타입간에만 이루어지게 된다. 이를 통해 실제 의존성이 발생하더라도 서로의 구체 타입은 알 수 없도록 한다. 이렇게 되면 두 상위 타입을 구현하는 어느 쪽도 변경이 가능한 상태가 된다.

구체적인 예를 위해서 RPG 게임을 제작한다고 생각해 보자. 일단 우리에게는 각종 무기들(Bow, Sword 등)이 필요할 것이다. 그리고 무기를 다루는 전사들이 있을 것이다. 일단 Warrior가 있다고 가정하자. 그런데 무기를 다루는 것은 전사 뿐만 아니라 대장장이(Smith)도 있다. 대장장이도 어떻게든 무기를 다룰 수 있도록 해 주어야 한다.

만일 Warrior가 구체적으로 Bow와 Sword를 다루는 구현을 가지고 있다면 Bow와 Sword를 변경할 때마다 Warrior의 구현도 변경되어야 할 것이다. 또한 무기가 추가되면 또 해당 무기에 대한 구현을 해야 한다. 또한 Smith 역시 무기들에 대한 구체적인 구현을 가지고 있다면 같은 문제점을 가지게 될 것이다.

이러한 경우에 Bridge 패턴을 이용하면 구체적인 클래스들 간의 의존성을 배제시킬 수 있다.


무기(Weapon) - 무기 핸들러(WaponHandler) Bridge 패턴 Class Diagram


위 클래스 다이어그램에서 보는 바와 같이 Weapon과 WeaponHandler는 각각 인터페이스이다. 그리고 구체적인 의존 관계는 이 인터페이스들 간에만 존재한다. Weapon을 구현한 Bow 클래스와 Sword 클래스는 실제 자신들을 다룰 구체적인 클래스를 알지 못한다. 역시 WeaponHandler를 구현한 Warrior나 Smith도 구체적인 무기, 즉 Bow나 Sword를 알지 못한다. 따라서 Weapon이 Spear, Gun 등과 같이 늘어나더라도 WeaponHandler의 구체 클래스들에는 변경에 있어서 영향을 주지 않는다.

그러면 실제 구현을 살펴 보자.


Weapon - WeaponHandler Bridge 패턴 구현

interface Weapon{

    public void attack();

    public void repair();

}

class Bow implements Weapon{

    public void attack(){

        System.out.println("Bow attack");

    }

    public void repair(){

        System.out.println("Bow repair");

    }

}

class Sword implements Weapon{

    public void attack(){

        System.out.println("Sword attack");

    }

    public void repair(){

        System.out.println("Sword repair");

    }

}


interface WeaponHandler{

    public void handle();

}

class Warrior implements WeaponHandler{

    private Weapon weapon;

    public Warrior(Weapon weapon){

        this.weapon = weapon;

    }

    public void handle(){

        System.out.print("Warrior ");

        weapon.attack();

    }

}

class Smith implements WeaponHandler{

    private Weapon weapon;

    public Smith(Weapon weapon){

        this.weapon = weapon;

    }

    public void handle(){

        System.out.print("Smith ");

        weapon.repair();

    }

}

여기서 Weapon 클래스 군과 WeaponHandler 클래스 군 간의 구체적인 의존성이 나타나는 곳은 Warrior와 Smith 클래스의 생성자에서 Weapon을 인자로 받는 부분이다. 이 경우에서 보듯이 Warrior나 Smith 클래스는 인터페이스인 Weapon만 알 뿐, 구체적인 타입은 알지 못한다.

이러한 방식으로 무기의 종류를 늘리거나 무기를 다루는 사람을 늘리더라도 다른 한 쪽에는 변경에 영향을 미치지 않도록 만들어 준다.

'5.디자인패턴' 카테고리의 다른 글

Factory Method 패턴  (4) 2016.09.16
Memento 패턴  (2) 2016.09.13
Template Method 패턴  (0) 2016.09.10
Singleton 패턴  (0) 2016.09.10
Builder 패턴  (0) 2016.09.10
Posted by 이세영2
,