본문 바로가기
디자인패턴

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

by 붕어사랑 티스토리 2022. 7. 4.
반응형

브릿지패턴이란?

위키피디아에서 정의가 아래와 같이 나와있다

 

브리지 패턴(Bridge pattern)이란 구현부에서 추상층을 분리하여 각자 독립적으로 변형할 수 있게 하는 패턴이다.

 

처음보는 사람은 이게 ㅅㅂ 뭔소리임? 할 것이다.

 

 

 

그리고 아래와 같은 그림도 같이 나오는데 이건 또 뭔 그림인가 할 것이다.

 

아주 심플하게 설명하겠다.

 

 

 

 

 

문제상황부터 보자

 

사람(Human)이라는 인터페이스를 하나 만들었다. 그리고 이 사람은 라면을 끓일것이다.

라면을 끓이는데 필요하는것은 스프를 넣는다, 면을 넣는다 이 두가지 기능이 있다고 하자.

 

라면을 끓이는데 면을 먼저 넣는 사람이 있을것이고, 스프를 먼저 넣는 사람이 있을것이다.

 

자 모든 케이스를 구현하려면 Human을 몇번 상속해야 할 까? 기능의 가지의 수가 2개이므로 총 경우의수는 2!인 사람 2명만 만들면 된다.

 

 

 

 

그런데 갑자기 기능이 하나가 추가되어 라면에 계란을 넣는다 라는 기능이 추가되었다.

그럼 나는 사람을 몇명 만들어야 모든 케이스에 대응할 수 있을까? 정답은 3! = 6명이다.

 

 

갑자기 또 기능이 추가되어 대파를 넣는다 라는게 또 생겼다.

 

 

이렇게 계속해서 기능이 늘어나면 모든 케이스에 대응해야할 사람의 수는 4!, 5!, 6!.........

 

기능 5개만 되어도 모든 케이스에 대응하려면 5! = 120 명이나 만들어야 된다.

 

 

 

끔찍하지 않은가? 이를 해결할 방법은 바로 브릿지 패턴이다!

 

 

 

 

 

아까 맨처음 보았던 그림과 정의

브리지 패턴(Bridge pattern)이란 구현부에서 추상층을 분리하여 각자 독립적으로 변형할 수 있게 하는 패턴이다.

 

 

여기서 추상부를 나눈다는것은 바로 기능의 구현을 떼어낸다는 의미이다.

 

 

그럼 위 그림에서 왼쪽놈은 껍데기 상속만을 담당하는 인터페이스이고

오른쪽놈은 기능을 담당하는 인터페이스이다.

 

 

자 그럼 3개의 라면 끓이기 기능이 있다고 하자. 브릿지 패턴을 이용해 모든 케이스에 대응할 수 있는 클래스의 수는?

 

정답은 4개이다. 아까 6개보다 가지수가 적다.

 

 

 

당장 코드로 예제를 보자

 

interface Work{
    abstract public void work();
}

class Noodle extends Work{
    @Override
    public void work(){
        System.out.println("면 넣기");
    }
}

class Soup extends Work{
    @Override
    public void work(){
        System.out.println("스프 넣기");
    }
}

class Egg extends Work{
    @Override
    public void work(){
        System.out.println("계란 넣기");
    }
}

 

위 코드는 기능부만 따로 구현한 예제이다.

 

 

 

 

interface Human{

}


class RamenChef extends Human{
    Work firstWork;
    Work secondWork;
    Work thirdWork;
    
    public void setFirstWork(Work w) { this.firstWork = w; }
    public void setSecondWork(Work w){ this.secondWork = w; }
    public void setThirdWork(Work w) { this.thirdWork = w; }
    
    public void cook(){
        firstWork.work();
        secondWork.work();
        thirdWork.work();
    }
}

위 코드는 기능부가 떨어져나간, 상속을 담당하는 부분이다.

 

위 코드를 보면 이제 감이 오는가? 바로 setter에 내가 원하는 기능들을 넣어주면 사람 인터페이스 한번만 구현하면 모든 케이스에 대응이 가능하다!!

 

 

 

 

면 -> 스프 -> 계란이면 아래처럼 하면 되고

RamenChecf.setFirstWork(new Noodle());
RamenChecf.setFirstWork(new Soup());
RamenChecf.setFirstWork(new Egg());
RamenChef.cook();

 

 

스프 -> 면 -> 계란이면 아래처럼 하면 된다.

RamenChecf.setFirstWork(new Soup());
RamenChecf.setFirstWork(new Noodle());
RamenChecf.setFirstWork(new Egg());
RamenChef.cook();

 

 

 

이렇게 기능부를 떼어내서 구현하면 유동적으로 모든케이스에 대응이 가능하다!!!

이것이 바로 브릿지 패턴이다.

 

만약 브릿지 패턴을 적용하지 않았을 경우, 면스프계란, 면계란스프, 스프면계란, 스프계란면, 계란면스프, 계란스프면 이 모든 케이스를 전부 만들어 줘야 했을 것이다.

 

 

 

 

근데 뭘 브릿지 하는 것일까? 뭐가 다리를 의미하나?

 

아래 그림에 가운데 연결해주는 선을 의미한다. 기능부를 따로 떼어낸 뒤에 이어준다는 뜻에서 브릿지이다!!

반응형

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

[디자인패턴] 컴포지트 패턴  (0) 2022.07.08

댓글