반응형
브릿지 패턴 (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)을 따로 확장하는 것이 가능해졌다.
장점과 단점
장점
- 추상적인 코드를 구체적인 코드 변경 없이도 독립적으로 확장할 수 있다.
- 추상적인 코드와 구체적인 코드를 분리 할 수 있다
단점
- 계층 구조가 늘어나 복잡도가 증가 할 수 있다.
참고
https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4/dashboard
'디자인패턴' 카테고리의 다른 글
데코레이터(Decorator) 패턴 (0) | 2022.08.04 |
---|---|
컴포짓(composite) 패턴 (0) | 2022.07.30 |
프로토타입(Prototype) 패턴 (0) | 2022.07.08 |
추상 팩토리 & 팩토리 메서드 패턴 & 팩토리 패턴 정의 (0) | 2022.06.19 |
팩토리 메소드 패턴(Factory Method Pattern) (0) | 2022.06.11 |