-
브릿지 패턴 (Bridge Pattern)디자인 패턴 2022. 7. 12. 14:04
브릿지 패턴 (Bridge Pattern)
추상적인 것과 구체적인 것을 구분하는 패턴
- 하나의 계층 구조일 때 보다 각기 나누었을 때 독립적인 계층 구조로 발전시킬 수 있다.
- 하나의 거대한 클래스나 기능부/구현부 로만 분리되어 있던 어플리케이션을 기능부/구현부 각각 독립적인 계층화 구조로 나누는 설계방식을 말한다.
브릿지 패턴 (Bridge Pattern) 적용 전
Champion 인터페이스는 모든 캐릭터(챔피언)가 사용할 수 있는 기능을 인터페이스로 정의해놨다.
public interface Champion { void move(); void skillQ(); void skillW(); void skillE(); void skillR(); }
아리 라는 캐릭터는 특정 Skin 을 선택할 수 있는데, 이 때 아리가 선택할 수 있는 스킨을 모두 클래스로 정의한다.
ex) KDA 스킨을 선택한 아리 = KDA아리
ex) poolParty 스킨을 선택한 아리 = PoolParty아리
신규 스킨이 출시되면 또 하나의 클래스를 생성한다. = new정복자아리
public class KDA아리 implements Champion{ @Override public void move() { System.out.println("KDA아리 move"); } @Override public void skillQ() { System.out.println("KDA아리 Q"); } @Override public void skillW() { System.out.println("KDA아리 W"); } @Override public void skillE() { System.out.println("KDA아리 E"); } @Override public void skillR() { System.out.println("KDA아리 R"); } }
public class PoolParty아리 implements Champion { @Override public void move() { System.out.println("PoolParty아리 move"); } @Override public void skillQ() { System.out.println("PoolParty아리 Q"); } @Override public void skillW() { System.out.println("PoolParty아리 W"); } @Override public void skillE() { System.out.println("PoolParty아리 E"); } @Override public void skillR() { System.out.println("PoolParty아리 R"); } }
public class new정복자아리 implements Champion{ @Override public void move() { System.out.println("신규스킨 정복자 아리 move"); } @Override public void skillQ() { System.out.println("신규스킨 정복자 아리 Q"); } @Override public void skillW() { System.out.println("신규스킨 정복자 아리 W"); } @Override public void skillE() { System.out.println("신규스킨 정복자 아리 E"); } @Override public void skillR() { System.out.println("신규스킨 정복자 아리 R"); } }
public class App { public static void main(String[] args) { KDA아리 kda아리 = new KDA아리(); kda아리.skillQ(); kda아리.skillW(); PoolParty아리 poolParty아리 = new PoolParty아리(); poolParty아리.skillE(); poolParty아리.skillQ(); } }
이와 같이 신규 스킨이 나올때마다 코드의 중복 발생과 변경이 일어날 경우 각 스킨마다 코드 수정을 해주어야 한다. (ocp 위배)
브릿지 패턴 (Bridge Pattern) 적용 후
defaultChampion 은 Champion 을 implements 하여 반복되는 모든 메소드들을 구현하였다.
그리고 각각의 캐릭터들은 defaultChampion 을 상속하도록 하고 각 캐릭터가 생성될때 어떤 스킨을 적용할지 생성자를 통해 주입받는다.
public class DefaultChampion implements Champion { private Skin skin; private String name; public DefaultChampion(Skin skin, String name) { this.skin = skin; this.name = name; } @Override public void move() { System.out.printf("%s %s move \n", skin.getName(), this.name); } @Override public void skillQ() { System.out.printf("%s %s Q \n", skin.getName(), this.name); } @Override public void skillW() { System.out.printf("%s %s W \n", skin.getName(), this.name); } @Override public void skillE() { System.out.printf("%s %s E \n", skin.getName(), this.name); } @Override public void skillR() { System.out.printf("%s %s R \n", skin.getName(), this.name); } }
public class 아리 extends DefaultChampion { public 아리(Skin skin) { super(skin, "아리"); } }
public class 아칼리 extends DefaultChampion{ public 아칼리(Skin skin) { super(skin, "아칼리"); } }
Skin 인터페이스를 하나 만들어 다양한 스킨을 만들 수 있도록 한다.
public interface Skin { String getName(); }
public class KDA implements Skin{ @Override public String getName() { return "KDA"; } }
public class PoolParty implements Skin{ @Override public String getName() { return "PoolParty"; } }
DefaultChampion 을 이용하여 캐릭터가 가질 수 있는 공통적인 기능을 구현해주고, Skin 또한 따로 분리함으로써 반복적인 코드가 사라지고 새로운 챔피언이나 스킨이 추가될 때 각각의 계층(Champion과 Skin)을 따로 확장하는 것이 가능해졌다.
장점과 단점
장점
- 추상적인 코드를 구체적인 코드 변경 없이도 독립적으로 확장할 수 있다. (OCP - Open Close Principal)
- 추상적인 코드와 구체적인 코드를 분리할 수 있다.
단점
- 계층 구조가 늘어나 복잡도가 증가할 수 있다.
참고
'디자인 패턴' 카테고리의 다른 글
데코레이터 패턴(Decorator Pattern) (0) 2022.07.19 컴포짓 패턴 (Composite Pattern) (0) 2022.07.12 어댑터 패턴 (Adapter Pattern) (0) 2022.07.05 프로토타입 (Prototype) 패턴 (0) 2022.06.29 추상 팩토리 (Abstract factory) 패턴 (0) 2022.06.19