추상적인 것과 구체적인 것을 분리하여 연결하는 패턴
하나의 계층 구조일 때 보다 각기 나누었을 때 독립적인 계층 구조로 발전시킬 수 있다.
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 구현체 클래스를 주입해서 스킨을 입은 챔피언을 만들 수 있다
- 장점
- 추상적인 코드를 구체적인 코드 변경 없이도 독립적으로 확장할 수 있다
- 추상적인 코드와 구체적인 코드를 분리할 수 있다
- 단점
- 계층 구조가 늘어나 복잡도가 증가할 수 있다
'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 |
댓글