본문 바로가기
디자인패턴/구조

[디자인패턴] 브릿지 패턴

by se0nghyun2 2023. 4. 28.
더보기
구조패턴 : 클래스나 객체를 상속과 합성을 통하여 더 큰 구조를 만드는 패턴

 

 

브릿지패턴

기능 계층 클래스와 구현 계층 클래스를 서로 연결하는 패턴

 

기능 계층 클래스??

부모클래스에 존재하는 기능을 상속받아 기능을 사용하는 클래스

 

구현 계층 클래스??

기능을 정의한 추상클래스나 인터페이스의 기능을 실제 기능을 구현하는 클래스

 

아래 코드에서 정확히 뭔지 확인해봅니다.

 

 

 

구조

  • Implementor

구현 클래스의 가장 최상위 계층

  • ConcreteImplementor

구현 클래스의 가장 최상위 계층을 상속 및 구현받은 클래스

실제 기능을 담당

  • Abstraction

기능 클래스의 가장 최상위 계층

공통적인 기능 사용을 위한 메소드들 존재

  • RefindAbstraction

공통적인 기능 사용을 위한 메소드들 정의

 


 

초기 요구사항!!!
과거 오락실에서 하는 철권, 오투잼 등 여러 종류의 게임이 있다.

게임 플레이 방법에는 
실제 코인을 넣고 하는 오프라인 플레이어 방식,
인터넷에서 게임을 다운 받아 가짜 코인으로 게임하는 온라인 방식이 있다.

1. 게임의 종류는 여러개 
2. 오프라인 유저만 존재한다.(코인에 대한 구현 아직 넣어두자)

 

 

 

기능 클래스

abstract class GamePlayer{
    GameApi gameApi;  //Bridge 역할

    GamePlayer(GameApi gameApi){
        this.gameApi=gameApi; //합성 통하여 연결
    }

    abstract void play();
}


class OfflineGamePlayer extends GamePlayer{

    OfflineGamePlayer(GameApi gameApi) {
        super(gameApi);
    }

    @Override
    void play() {
        this.gameApi.PlayGame(); //실제 기능을 담당하는 구현클래스를 통하여 기능 사용
    }
}

기능계층 클래스의 가장 최상위 추상클래스 GamePlayer 가 존재한다.

1. GamApi gameApi;

구현 클래스 계층의 실제 기능을 "사용"을 위하여 매개변수로 존재하며 Bridge 역할을 한다.

또한 합성을 통하여 연결된다.

 

 

 

 

구현 클래스

interface GameApi{
    void PlayGame();
}

class 철권 implements GameApi{
    @Override
    public void PlayGame() {
        System.out.println("철권 게임 시작");
    }
}
class 오투잼 implements GameApi{
    @Override
    public void PlayGame() {
        System.out.println("오투잼 게임 시작");
    }
}

구현 클래스의 가장 최상위 인터페이스인 GameApi가 존재한다.

해당 클래스를 구현한 철권,오투잼 클래스에서 PlayGame 메소드에서 "실제 기능"을 구현한다.

 


 

아래처럼 요구사항이 늘었다.

브릿지 패턴의 이점을 활용할 수 있다.

과거 오락실에서 하는 철권, 오투잼 등 여러 종류의 게임이 있다.
게임 플레이 방법에는 실제 코인을 넣고 하는 오프라인 플레이어 방식,
인터넷에서 게임을 다운 받아 가짜 코인으로 게임하는 온라인 방식이 있다.
1. 게임의 종류는 여러개 
2. 오프라인 유저만 존재한다.
추가요구사항3. 온라인 유저도 존재한다.
추가요구사항4. 오프라인 유저는 진짜 코인을 삽입하고 온라인 유저는 가짜 코인을 통하여 게임을 플레이 할 수 있다.
추가요구사항5. 모든 게임들은 게임 시작 전 초기화를 반드시 진행해야 한다.

 

기능 클래스의 요구 사항에 대한 로직 수정

추가요구사항3. 온라인 유저도 존재한다

추가요구사항4. 오프라인 유저는 진짜 코인을 삽입하고 온라인 유저는 가짜 코인을 통하여 게임을 플레이 할 수 있다

=> 모두 기능클래스 즉, 기능을 사용하는 계층에 대한 요구사항들이다.

abstract class GamePlayer{
    GameApi gameApi;  //Bridge 역할

    GamePlayer(GameApi gameApi){
        this.gameApi=gameApi; //합성 통하여 연결
    }

    abstract void play();
    abstract void insertCoin(); //코인 삽입
}


class OfflineGamePlayer extends GamePlayer{

    OfflineGamePlayer(GameApi gameApi) {
        super(gameApi);
    }

    @Override
    void play() {
        this.gameApi.PlayGame(); //실제 기능을 담당하는 구현클래스를 통하여 기능 사용
    }
    
     void insertCoin(){
    	//공통적인 기능 추가
    }
}


/*온라인 유저 클래스를 최상위 추상클래스를 상속받아 쉽게 정의가능 */
class OnlineGamePlayer extends GamePlayer{ 

    OnlineGamePlayer(GameApi gameApi) {
        super(gameApi);
    }

    @Override
    void play() {
        this.gameApi.PlayGame(); //실제 기능을 담당하는 구현클래스를 통하여 기능 사용
    }
    
    void insertCoin(){
    	//공통적인 기능 추가
    }
}

게임플레이어는 모두 진짜든 가짜든 코인삽입을 해야하기에

GamePlayer 추상클래스 내 insertCoin메서드를 정의하였으며, 상속받은 자식클래스에서 해당 메서드를 구현만 하기만 하면 된다. 확장이 되게 용이해졌다.

 

 

구현 클래스의 요구 사항에 대한 로직 수정

추가요구사항5. 모든 게임들은 게임 시작 전 초기화를 반드시 진행해야 한다.

 => Game의 실제 기능이 추가되어져야 한다.

interface GameApi{
    void PlayGame();
    void gameInit(); //실제 기능에 대한 메소드 추가 정의
}

class 철권 implements GameApi{
    @Override
    public void PlayGame() {
        System.out.println("철권 게임 시작");
    }
    
    @Override
    public void gameInit() {
        System.out.println("철권 게임 초기화");
    }
}

class 오투잼 implements GameApi{
    @Override
    public void PlayGame() {
        System.out.println("오투잼 게임 시작");
    }
    
     @Override
    public void gameInit() {
        System.out.println("오투잼 게임 초기화");
    }
}

실제 기능 추가를 위하여 gameInit()메서드가 추가되었으며 각각 구현하면 된다.

 


 

이처럼 계층을 나누었기에 

- 실제 기능의 추가가 필요한 경우 구현 클래스 내에서

- 기능 사용에 대한 추가가 필요한 경우 기능 클래스에서

기본 코드 삭제 및 수정 없이 확장이 가능하다.

 

브릿지패턴

기능 계층 클래스와 구현 계층 클래스를 서로 연결하는 패턴

=> 쉽게 말하면 기능의 사용 과  실제기능담당 을 분리하는 패턴

 


참고

Bridge Pattern - 브릿지 패턴 — 천천히 올바르게 (tistory.com)

[디자인 패턴] 구조 패턴 - (2) 브릿지 패턴 (Bridge Patterns) (tistory.com)

[Design Pattern] Bridge (tistory.com)

Bridge 패턴 (tistory.com)