본문 바로가기
java

Design Patterns - Bridge

by 쭈꾸마뇽 2021. 11. 28.

추상적인 것과 구체적인 것을 분리하여 연결하는 패턴

하나의 계층 구조일 때 보다 각기 나누었을 때 독립적인 계층 구조로 발전시킬 수 있다.

public interface Skin {
    String getName();
}
public interface Champion extends Skin {

    void move();

    void skillQ();

    void skillW();

    void skillE();

    void skillR();

}
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);
    }

    @Override
    public String getName() {
        return null;
    }
}

Champion를 상속하는 DefaultChampion이라는 클래스를 만들어 준다.  이 DefaultChampion 클래스는 일종의 템플릿 처럼 Champion들이 기본적으로 갖고 있는 함수들을 정의해주며 Skin과 name을 인스턴스 변수로 갖는다

public class KDA implements Skin{
    @Override
    public String getName() {
        return "KDA";
    }
}
public class PoolParty implements Skin {
    @Override
    public String getName() {
        return "PoolParty";
    }
}

Skin을 상속받는 클래스들을 만들어주어 Champion에 주입해줄것이다

public class 아리 extends DefaultChampion {

    public 아리(Skin skin) {
        super(skin, "아리");
    }
}
public class 아칼리 extends DefaultChampion{

    public 아칼리(Skin skin) {
        super(skin, "아칼리");
    }
}

DefaultChampion을 상속받는 실제로 사용할 클래스들을 작성해 준다.  아리, 아칼리 클래스는 Skin을 매개변수로 받아서 고유의 이름과 함께 초기화 해준다

public abstract class App implements Champion {

    public static void main(String[] args) {
        Champion kda아리 = new 아리(new KDA());
        kda아리.skillQ();
        kda아리.skillW();

        Champion poolParty아리 = new 아리(new PoolParty());
        poolParty아리.skillR();
        poolParty아리.skillW();
    }
}

클라이언트에서는 원하는 Champion을 생성할 때 Champion 구현체 클래스에 Skin 구현체 클래스를 주입해서 스킨을 입은 챔피언을 만들 수 있다

  • 장점
    • 추상적인 코드를 구체적인 코드 변경 없이도 독립적으로 확장할 수 있다
    • 추상적인 코드와 구체적인 코드를 분리할 수 있다
  • 단점
    • 계층 구조가 늘어나 복잡도가 증가할 수 있다

 

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

'java' 카테고리의 다른 글

Design Patterns - Decorator  (0) 2021.12.04
Design Patterns - Composite  (0) 2021.11.29
Design Patterns - Adapter  (0) 2021.11.24
Design Patterns - Prototype  (0) 2021.11.22
Design Patterns - Builder  (0) 2021.11.21

댓글