728x90
반응형
Champion.java
public interface Champion{
void move();
void skillQ();
void skillW();
void skillE();
void SkilR();
}
스킨과 스킬이 바뀌어야한다는 과정을 표현
KDA아리.java
public 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 App{
public static void main(String[] args){
Champion kda아리 = new KDA아리();
kda아리.skilQ();
kda아리.skilR();
}
}
개선
DefaultChampion
public class DefaultChampion implements Champion{
private Skin skin;
pirvate 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);
}
}
Skin
public interface Skin{
String getName();
}
챔피언 늘리기
아리
public class 아리 extends DefaultChampion{
pulic 아리(Skin skin){
Super(skin, "아리");
}
}
아칼리
public class 아칼리 extends DefaultChampion{
pulic 아칼리(Skin skin){
Super(skin, "아칼리");
}
}
스킨 추가
KDA
public class KDA implements Skin{
@Override
public String getName(){
return "KDA";
}
}
PoolParty
public class PoolParty implements Skin{
@Override
public String getName(){
return "PoolParty";
}
}
- 장점 기존의 코드 건들지 않고, 반대쪽 계층 구조 건들지 않고 현재 계층 구조만 확장
App
public class App{
public static void main(String[] args){
Champion kda아리 = new 아리(new KDA());
kda아리.skilQ();
kda아리.skilR();
Champion poolParty아리 = new 아리(new PoolParty());
poolParty아리.skilQ();
poolParty아리.skilR();
}
}
- 이론적으로는 클라이언트 코드가 추상화되어 있는 abstraction 계층구조만 쓰고 스킨만 사용하는것임
- 스킨은 Concreate Implementation이되고,
- 각각의 챔피언은 디자인 패턴 그림에서 Refined Abscraction이 됨
728x90
반응형
'CS Study > 디자인패턴' 카테고리의 다른 글
2021.12.08_브릿지패턴04.자바와스프링에서찾아보는패턴 (0) | 2021.12.08 |
---|---|
2021.12.08_브릿지패턴03.장점과단점 (0) | 2021.12.08 |
2021.12.08_브릿지패턴01.패턴소개 (0) | 2021.12.08 |
2021.12.07_어댑터패턴04.자바와스프링에서찾아보는패턴 (0) | 2021.12.07 |
2021.12.07_어댑터패턴03.장점과단점 (0) | 2021.12.07 |
댓글