브릿지패턴이란?
위키피디아에서 정의가 아래와 같이 나와있다
브리지 패턴(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 |
---|
댓글