본문 바로가기
데이터 [Data]/Java & JSP

전략 패턴(Strategy Pattern) 예제 만들기: 2021 KBO 구단

by 냉철하마 2021. 5. 5.

Java의 디자인 패턴 - 전략 패턴: 각각의 알고리즘군을 교환이 가능하도록 별도로 정의하고 각각 캡슐화한 후 서로 교환해서 사용할 수 있는 패턴이다. 즉, 프로젝트 전체에서 변경이 일어나지 않는 부분에서 변경이 일어나는 부분을 찾아서 따로 캡슐화하는 것이다.

 ※ 설명 출처: niceman.tistory.com/133

 

Java(자바) 디자인패턴 - 전략(Strategy) 패턴 설명 및 예제소스

Java 디자인패턴 - 전략(Strategy) 패턴 오늘부터 Java 디자인 패턴을 예제와 함께 설명하는 포스팅을 하려고 합니다. 그 중에서 첫 번 째로 실무 프로젝트에서 가장 많이 사용하고 중요한 전략패턴

niceman.tistory.com

 

 

 

자체 예제 - 2021년 KBO 구단의 연고지와 원년 창단여부

Java 패키지명으로 KBO2021 사용

 

 

1) 연고지: Hometown

[HomeTown.java - 인터페이스]

package KBO2021;

 

public interface HomeTown {

       public void home();

}

 

 

[Capital.java]

package KBO2021;

 

public class Capital implements HomeTown {

 

       @Override

       public void home() {

               // TODO Auto-generated method stub

               System.out.println("서울, 경기, 인천 수도권 구단입니다.");

       }

 

}

 

 

[NonCapital.java]

package KBO2021;

 

public class NonCapital implements HomeTown {

 

       @Override

       public void home() {

               // TODO Auto-generated method stub

               System.out.println("영남, 충청, 호남 지방 구단입니다.");

       }

 

}

 

2) 원년 창단여부: Established

[Established.java - 인터페이스]

package KBO2021;

 

public interface Established {

       public void est();

}

 

 

[Origin.java]

package KBO2021;

 

public class Origin implements Established {

 

       @Override

       public void est() {

               // TODO Auto-generated method stub

               System.out.println("전신 포함, KBO 원년인 1982년에 창단된 구단입니다.");

       }

 

}

 

 

[NonOrigin.java]

package KBO2021;

 

public class NonOrigin implements Established {

 

       @Override

       public void est() {

               // TODO Auto-generated method stub

               System.out.println("원년 이후인 1983 이후에 창단된 구단입니다.");

       }

 

}

 

 

3) KBO + 구단별 코드

[KBO.java]

package KBO2021;

 

public abstract class KBO {

      

       HomeTown homeTown;

       Established established;

      

       public KBO() {

       }

 

       abstract void display();

 

       public void performEst() {

               established.est();

       }

 

       public void performHome() {

               homeTown.home();

       }

      

       public void setHomeTown (HomeTown ht) {

               homeTown = ht;

       }

 

       public void setEstablished(Established est) {

               established = est;

       }

      

       public void active() {

               System.out.println("2015 이후로 10 구단 체제로 리그가 진행중입니다!");

       }

      

}

 

[Lions.java]

package KBO2021;

 

public class Lions extends KBO {

 

       public Lions() {

               homeTown = new NonCapital();

               established = new Origin();

       }

      

       @Override

       public void display() {

               System.out.println("1982 창단, 대구를 연고지로 갖는 '삼성 라이온즈' 입니다.");

               System.out.println("프로 원년 이름을 그대로 갖고 있는 유이한 하나입니다.");

       }

      

}

 

 

[Tigers.java]

package KBO2021;

 

public class Tigers extends KBO {

      

       public Tigers() {

               homeTown = new NonCapital();

               established = new Origin();

       }

      

       @Override

       public void display() {

               System.out.println("1982 창단, 광주를 연고지로 갖는 'KIA 타이거즈'입니다.");

               System.out.println("해태 타이거즈를 전신으로 구단입니다.");

       }

      

}

 

 

[Giants.java]

package KBO2021;

 

public class Giants extends KBO {

 

       public Giants() {

               homeTown = new NonCapital();

               established = new Origin();

       }

      

       @Override

       public void display() {

               System.out.println("1982 창단, 부산을 연고지로 갖는 '롯데 자이언츠' 입니다.");

               System.out.println("프로 원년 이름을 그대로 갖고 있는 유이한 하나입니다.");

       }

      

}

 

 

[Bears.java]

package KBO2021;

 

public class Bears extends KBO {

      

       public Bears() {

               homeTown = new Capital();

               established = new Origin();

       }

      

       @Override

       public void display() {

               System.out.println("1982 창단, 서울을 연고지로 갖는 '두산 베어스'입니다.");

               System.out.println("OB 베어스를 전신으로 구단입니다.");

       }

 

}

 

[Twins.java]

package KBO2021;

 

public class Twins extends KBO {

 

       public Twins() {

               homeTown = new Capital();

               established = new Origin();

       }

      

       @Override

       public void display() {

               System.out.println("1982 창단, 서울을 연고지로 갖는 'LG 트윈스'입니다.");

               System.out.println("MBC 청룡을 전신으로 구단입니다.");

       }

 

}

 

[Eagles.java]

package KBO2021;

 

public class Eagles extends KBO {

      

       public Eagles() {

               homeTown = new NonCapital();

               established = new NonOrigin();

       }

      

       @Override

       public void display() {

               System.out.println("1986 창단, 대전을 연고지로 갖는 '한화 이글스'입니다.");

               System.out.println("빙그레 이글스를 전신으로 구단입니다.");

       }

 

}

 

[Landers.java]

package KBO2021;

 

public class Landers extends KBO {

 

       public Landers() {

               homeTown = new Capital();

               established = new NonOrigin();

       }

      

       @Override

       public void display() {

               System.out.println("2000 창단, 인천을 연고지로 갖는 'SSG 랜더스'입니다.");

               System.out.println("신세계그룹이 SK 와이번스를 인수하여 재창단한 구단입니다.");

       }

 

}

 

 

[Heroes.java]

package KBO2021;

 

public class Heroes extends KBO {

      

       public Heroes() {

               homeTown = new Capital();

               established = new NonOrigin();

       }

      

       @Override

       public void display() {

               System.out.println("2008 창단, 서울을 연고지로 갖는 '키움 히어로즈'입니다.");

               System.out.println("우리 히어로즈, 서울 히어로즈, 넥센 히어로즈 등의 명칭을 있습니다.");

       }

 

}

 

[Dinos.java]

package KBO2021;

 

public class Dinos extends KBO {

 

       public Dinos() {

               homeTown = new NonCapital();

               established = new NonOrigin();

       }

      

       @Override

       public void display() {

               System.out.println("2011 창단, 창원을 연고지로 갖는 'NC 다이노스'입니다.");

               System.out.println("2013년부터 1 페넌트레이스에 참가하였습니다.");

       }

 

}

 

[Wiz.java]

package KBO2021;

 

public class Wiz extends KBO {

 

       public Wiz() {

               homeTown = new Capital();

               established = new NonOrigin();

       }

 

       @Override

       public void display() {

               System.out.println("2013 창단, 수원을 연고지로 갖는 'kt 위즈'입니다.");

               System.out.println("2015년부터 1 페넌트레이스에 참가하였습니다.");

       }

 

}

 

 

4) 시뮬레이터: 삼성, KIA, SSG, NC를 예시로 실행결과 확인

[KBOSimulator.java]

package KBO2021;

 

public class KBOSimulator {

 

       public static void main(String[] args) {

               KBO lions = new Lions();

               lions.display();

               lions.performEst();

               lions.performHome();

               System.out.println();    // 개행

              

               KBO tigers = new Tigers();

               tigers.display();

               tigers.performEst();

               tigers.performHome();

               System.out.println();    // 개행

              

               KBO landers = new Landers();

               landers.display();

               landers.performEst();

               landers.performHome();

               System.out.println();    // 개행

 

               KBO dinos = new Dinos();

               dinos.display();

               dinos.performEst();

               dinos.performHome();

               System.out.println();    // 개행

      

       }

}

 

 

∴ 전략 패턴을 통해 각각을 캡슐화한 후 서로 교환하여 출력하는 모습을 확인할 수 있다.

  이를 통해 시뮬레이터에서 구단별 기초정보, 연고지, 창단연도 등을 모두 출력할 수 있다.

댓글