2021.12.07_브릿지패턴02.패턴적용하기
본문 바로가기
CS Study/디자인패턴

2021.12.07_브릿지패턴02.패턴적용하기

by KyeongMin 2021. 12. 8.
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이 됨

https://github.com/3DPIT/study/blob/master/05.%EC%BD%94%EB%94%A9%EC%9C%BC%EB%A1%9C%ED%95%99%EC%8A%B5%ED%95%98%EB%8A%94GoF%EC%9D%98%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4/02.%EA%B5%AC%EC%A1%B0%EA%B4%80%EB%A0%A8%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4/%EB%B8%8C%EB%A6%BF%EC%A7%80%ED%8C%A8%ED%84%B4/2021/1208/02.%ED%8C%A8%ED%84%B4%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0/2021.12.07_%EB%B8%8C%EB%A6%BF%EC%A7%80%ED%8C%A8%ED%84%B402.%ED%8C%A8%ED%84%B4%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0.md

 

GitHub - 3DPIT/study

Contribute to 3DPIT/study development by creating an account on GitHub.

github.com

 

728x90
반응형

댓글