2022-03-17 @이영훈
브릿지 패턴
구현에서 추상을 분리하여, 이들이 독립적으로 다양성을 가질 수 있도록 합니다.
게임과 게이머 예시
게이머가 게임을 합니다. 게이머는 LoL을 할수도 스타크래프트를 할수도 있습니다.
게이머는 게임에 종속되지 않고 게임을 변경할 수 있도록 게임을 인터페이스로 만들고 게임 인터페이스를 상속하여 여러 게임을 만듭니다. 그리고 게이머는 인터페이스 게임에 의존합니다. (의존한다: 알고 있다. 변수로 사용하고 있다)
게이머가 롤 게임을 받으면 롤 게이머가 되고 스타크래프트 게임을 받으면 스타크래프트 게이머가 됩니다.
브릿지 패턴은 추상과 구현을 분리하여 확장 가능하도록 설계하는 패턴입니다. 그래서 인터페이스 구현체가 하나인 경우에는 브릿지 패턴 사용의 의미가 퇴색합니다. (GoF 디자인 패턴 p.218)
게임과 게이머 예시 구현
게임 인터페이스를 만듭니다
public interface Game {
public void gameInfo();
public void playGame();
}
Java
복사
게임 인터페이스를 상속한 여러 게임을 만듭니다.
롤과 국민 민속게임 스타크래프트를 만들겠습니다.
public class LoL implements Game {
@Override
public void gameInfo() {
System.out.println("League of Legend");
}
@Override
public void playGame() {
System.out.println("페이커 급 무빙. 롤 중 🔥");
}
}
Java
복사
public class Starcraft implements Game {
@Override
public void gameInfo() {
System.out.println("한국 민속놀이 스타크래프트");
}
@Override
public void playGame() {
System.out.println("스타 빡겜 중 🔥");
}
}
Java
복사
이제 게임을 하는 게이머를 만듭니다. 게이머는 롤과 스타크래프트와 같은 구현체에 의존하는 것이 아니라 게임 인터페이스에 의존합니다.
public abstract class Gamer {
private Game game; // 게임 인터페이스에 의존합니다
private int winCount;
protected Gamer(Game game) {
this.game = game;
}
public abstract void gamerInfo();
public void gameInfo() {
game.gameInfo();
}
public void playGame() {
game.playGame();
}
public int getWinCount() {
return winCount;
}
public void increaseWinCount() {
winCount++;
}
}
Java
복사
게이머 추상 클래스를 상속하여 롤 게이머와 스타크래프트 게이머를 만들겠습니다
public class LolGamer extends Gamer {
protected LolGamer(Game game) {
super(game);
}
@Override
public void gamerInfo() {
System.out.println("롤 게임 유저입니다");
}
}
Java
복사
public class StarcraftGamer extends Gamer {
protected StarcraftGamer(Game game) {
super(game);
}
@Override
public void gamerInfo() {
System.out.println("스타크래프트 게임 유저입니다");
}
}
Java
복사
게임과 게이머 예시 실행
public class BridgePatternApplication {
public static void main(String[] args) {
// 게임 생성
LoL loL = new LoL();
Starcraft starcraft = new Starcraft();
// 프로게이머 생성
LolGamer faker = new LolGamer(loL);
StarcraftGamer parkDaeHo = new StarcraftGamer(starcraft); // 노빠꾸 테란 박대호
// 프로게이머가 게임을 합니다
faker.gamerInfo();
faker.playGame();
faker.increaseWinCount();
System.out.println("faker.getWinCount() = " + faker.getWinCount());
/*
* 롤 게임 유저입니다
* 페이커 급 무빙. 롤 중 🔥
* faker.getWinCount() = 1
* */
parkDaeHo.gamerInfo();
parkDaeHo.playGame();
parkDaeHo.increaseWinCount();
System.out.println("parkDaeHo.getWinCount() = " + parkDaeHo.getWinCount());
/*
* 스타크래프트 게임 유저입니다
* 스타 빡겜 중 🔥
* parkDaeHo.getWinCount() = 1
* */
}
}
Java
복사