조금 더 알아보자!
OCP 원칙을 준수하며 유연성이 강한 전략패턴을 짱구에 적용해보자.
전략패턴? Strategy
WHEN : 알고리즘을 교체해야할 때 사용한다.
인터페이스를 사용하는 당사자를 컨텍스트라고 한다.

필요한 것 : 전략 인터페이스, 전략의 구현된 구체클래스, 전략을 쓸지 결정하는 컨텍스트 클래스.
구조를 그려봅시다.
짱구
- 철없는 모습 - 춤추는모습
- 잠자는 모습 - 귀찮은것들은 회피
- 멋있는 액션가면모드 장착
package week6DesignLab;
public interface IBehaviorStrategy{
public void behave(String context);
}
모든것의 시초가 되는 인터페이스.
package week6DesignLab;
public class DanceStrategy implements IBehaviorStrategy{
@Override
public void behave(String context) {
// TODO Auto-generated method stub
System.out.println(context+ "상황.. 개구쟁이모드! 매너 그런거 없다"); //자는척한다. 회피한다 아는척하면
System.out.println("울라 울라 춤을 추어요. )) ) )) 방귀 뿡 =3=3");
}
}
package week6DesignLab;
public class ActionMaskStrategy implements IBehaviorStrategy{
@Override
public void behave(String context) {
// TODO Auto-generated method stub
System.out.println(context+ "상황! 액션가면 출동!");
System.out.println("약자를 도와 정의의 이름으로 심판합니다!");
}
}
package week6DesignLab;
public class SleepStrategy implements IBehaviorStrategy{
@Override
public void behave(String context) {
// TODO Auto-generated method stub
System.out.println(context+ "상황.. 갑자기 잠이 옵니다."); //자는척한다. 회피한다 아는척하면
System.out.println("눈을 감고 자는척을 하자~!!");
}
}
구체적인 전략. 상황에 따라 행동지침을 바꾼다.
package week6DesignLab;
public class 짱구 {
private IBehaviorStrategy strategy = null;
public void setStrategy(IBehaviorStrategy strategy) {
this.strategy = strategy; //외부에서 주입받고있음.
System.out.println("--- 현재 짱구의 매너전략(마음가짐) 변경: "+ this.strategy.getClass().getSimpleName()+" 장착완료!"); //getname은 패키지까지해서이름, simple네임은 클래스이름만
}
public void encounterSituation(String situation) {
System.out.println("[상황발생!]" + situation);
//전략이 없다면?초기값을 넣어준다. 기본적으로 개구쟁이니까
if(this.strategy == null) {
System.out.println("현재 전략 없음 무념무상상태");
System.out.println("그냥놀고있어요~");
return;
}
this.strategy.behave(situation); // 해당 상황의 동작을 수행하자.
}
}
실제 행동을수행할 짱구. 짱구는 구체적인 행동 모두를 포함하는 상위인 인터페이스를 가지도록한다. 그리고 전략을 바꿀 수 있다.
package week6DesignLab;
public class Main {
public static void main(String args[]) {
짱구 a = new 짱구();
//전략이 없는상황
a.encounterSituation("내일 갑자기 시험을 본다!");
//1. 엄마가 심부름 시키려고 해보자.
a.setStrategy(new SleepStrategy());
a.encounterSituation("엄마가 귀찮은 심부름을 시키려고 할 때");
//2. 훈이가 괴롭힘당하는상황
a.setStrategy(new ActionMaskStrategy());
a.encounterSituation("훈이가 괴롭힘 당하고있어요");
a.setStrategy(new DanceStrategy());
a.encounterSituation("친구들과 놀이터에서 놀고있을 때");
//
a.setStrategy(new DanceStrategy());
a.setStrategy(new SleepStrategy());
a.setStrategy(new ActionMaskStrategy());
}
}

실행결과
근데 전략을 먼저 변경하고 -> 상황을 시키는게 뭔가 이상하다.
그럼 어떻게 해야할까...? 이후에 수정해보자....
'컴퓨터공학과 > Java 1 & 2' 카테고리의 다른 글
| [Java]#12주차 . DB&JDBC 정리 및 실습복기 (0) | 2025.11.16 |
|---|---|
| [java] Gui (+Thread) 실습#6 (1) | 2025.11.02 |
| [Java] 커피메이커 리팩토링 - SOLID 원칙 적용 +V2,V3 | 추가패턴조사 (0) | 2025.10.11 |
| [Java] Thread (0) | 2025.09.22 |
| [Java] Set과 Map (0) | 2025.09.17 |