Java의 디자인 패턴 - 전략 패턴: 각각의 알고리즘군을 교환이 가능하도록 별도로 정의하고 각각 캡슐화한 후 서로 교환해서 사용할 수 있는 패턴이다. 즉, 프로젝트 전체에서 변경이 일어나지 않는 부분에서 변경이 일어나는 부분을 찾아서 따로 캡슐화하는 것이다.
※ 설명 출처: niceman.tistory.com/133
Java(자바) 디자인패턴 - 전략(Strategy) 패턴 설명 및 예제소스
Java 디자인패턴 - 전략(Strategy) 패턴 오늘부터 Java 디자인 패턴을 예제와 함께 설명하는 포스팅을 하려고 합니다. 그 중에서 첫 번 째로 실무 프로젝트에서 가장 많이 사용하고 중요한 전략패턴
niceman.tistory.com
자체 예제 - 2021년 KBO 구단의 연고지와 원년 창단여부
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(); // 개행
}
}
∴ 전략 패턴을 통해 각각을 캡슐화한 후 서로 교환하여 출력하는 모습을 확인할 수 있다.
이를 통해 시뮬레이터에서 구단별 기초정보, 연고지, 창단연도 등을 모두 출력할 수 있다.
'데이터 [Data] > Java & JSP' 카테고리의 다른 글
히어로 야구 시뮬레이터 (GitHub) - 인공지능 개발자 양성과정 Java 프로젝트 (0) | 2021.06.11 |
---|---|
Java 미니 프로젝트 계획서.txt: 히어로 야구 시뮬레이터 (0) | 2021.05.07 |
스토리 기반 Java 예제: 객체지향 프로그래밍, 배열, get-set 메소드 (0) | 2021.04.30 |
[이것이 자바다] '4장. 조건문과 반복문' 확인문제 (0) | 2021.04.29 |
상속 (0) | 2021.04.29 |
댓글