구조 패턴: 브릿지 패턴

xellos·2022년 4월 2일
0

디자인 패턴

목록 보기
7/20

소개

  • 추상적인 것과 구체적인 것을 분리하여 연결하는 패턴이다.
  • 하나의 계층 구조일때 보다 각기 나누었을 때 독립적인 계층구주로 발전시킬 수 있다.

1) 장점

  1. 추상적인 코드를 구체적인 코드 변경 없이도 독립적으로 확장할 수 있다.
  2. 추상적인 코드와 구체적인 코드를 분리할 수 있다.

2) 단점

  1. 계층 구조가 늘어나 복잡도가 증가할 수 있다.

분리전

1) 인터페이스

public interface Champion {
	void move();
    void skillQ();
    void skillW();
    void skillE();
    void skillR();
}

2) 구현 클래스

KDA 아리 )

public class KdaAri 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 HanbokAri 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"); }
}

분리후

Champion과 Skin의 개념을 분리한다.

1) 인터페이스 추가 작성

Skin 인터페이스

public interface Skin {
	String getName();
}

Champion이 상속

public interface Champion extends Skin {
	void move();
    void skillQ();
    void skillW();
    void skillE();
    void skillR();
}

2) 추상화 클래스 작성

분리한 Champion 인터페이스를 추상 메서드가 구현한다. 이때, 추상 클래스에서 분리한 구체 인터페이스를 가진다.

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.println("%s %s move\n", skin.getName(), this.name);
    }
    
    @Override
    public void skillQ() {
    	System.out.println("%s %s Q\n", skin.getName(), this.name);
    }
    
    @Override
    public void skillW() {
    	System.out.println("%s %s W\n", skin.getName(), this.name);
    }
    
    @Override
    public void skillE() {
    	System.out.println("%s %s E\n", skin.getName(), this.name);
    }
    
    @Override
    public void skillR() {
    	System.out.println("%s %s R\n", skin.getName(), this.name);
    }
    
    @Override
    public void getName() {
    	return skin.getName();
    }
}

3) 구현 클래스 작성

Champion 구현

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

Skin 구현

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

사용

public class App implements Champion {
	public static void main(String[] args) {
    	Champion kdaAri = new Ari(new KDA());
        kdaAri.skillQ();
        kdaAri.skillW();
        
        Champion hanbokAri = new Ari(new Hanbok());
        hanbokAri.skillR();
        hanbokAri.skillE();
    }
}

0개의 댓글