티스토리 뷰

 

코드 흐름

  • 행동 전략 Interface - public void behave(String context)
  • 각각 구체화된 전략들 클래스 - 메소드 오버라이딩
  • 전략들을 사용할 주체 : 짱구
    • 전략 세팅하는 메소드 - setStrategy (IBehaviorStrategy strategy)
    • 전략 수행하는 메소드 - encountSituation(String situation)
  • 짱구가 전략을 ‘사용’할 것이니 상위Interface 전략을 필드로 갖는다.
  • 메인에서 짱구 주체 객체를 생성하고 짱구 a = new 짱구()
  • 짱구가 전략 선택(setStrategy), 상황에 맞게 행동한다.(encountSituation)

 

IBehaviorStrategy

전략을 끼워넣는 구조 , OCP(개방폐쇄 원칙)에 충실한 패턴인 전략 패턴을 활용해보자.

전략 INTERFACE

public interface IBehaviorStrategy {
	public void behave(String context);//특정상황에 있을 때 이 동작 해라 라고 알려준다. 
}

 

INTERFACE를 구체화시킬 각각의 클래스 4개

  • ActionMaskStrategy
  • DanceStrategy
  • SleepStrategy
  • 철이Strategy
public class ActionMaskStrategy implements IBehaviorStrategy{

	@Override
	public void behave(String context) {
		// TODO Auto-generated method stub
		System.out.println(context +"상황 : 위풍당당!!!");
		System.out.println("액션가면 출동! 파워워킹을 합니다~!!!!!!!!!!");
		System.out.println("정의의 이름으로 악당을 물리치고 약자를 도와줍니다!!!!!!!!!!");	
	}
}

-----------------------
public class DanceStrategy implements IBehaviorStrategy{

	@Override
	public void behave(String context) {
		// TODO Auto-generated method stub
		System.out.println(context +" 상황 : 개구쟁이 모드! 매너? 그런거 업음!");
		System.out.println("엉덩이 춤을 추면서 방귀 뽕뽕~");
	}

}
----------------------
public class SleepStrategy implements IBehaviorStrategy{

	@Override
	public void behave(String context) {
		// TODO Auto-generated method stub
		System.out.println(context +" 상황... 갑자기 졸리다..ZZZZZZZ");
		System.out.println("눈을 감고 상황을 회피해보자~!");
	}
	
}

 

추가한 전략 : 철이Strategy

추가하는 게 정말 쉽다... OCP(개방폐쇄원칙에 완벽히 부합한다...)

public class 철이Strategy implements IBehaviorStrategy{

	@Override
	public void behave(String context) {
		// TODO Auto-generated method stub
		System.out.println(context +"상황 : 짱아에게 맡기기 모드!");
		System.out.println("동생아 가라~~!!! 네가 나 대신 해줘!");
		System.out.println("동생에게 어려운 건 다 맡겨버리자~~~ 짱아야 고마워^^!");
	}

}

 

실제 전략을 선택하여 사용하는 짱구 주체

public class 짱구 {
	private IBehaviorStrategy strategy = null;//final : 한번 결정해놓으면 수정 없이 쓰고 싶어
	
	//set은 public이어야
	//매너는 외부에서 주입하고 있다. 
	public void setStrategy(IBehaviorStrategy strategy) {
		this.strategy = strategy;
		System.out.println("-----현재 짱구의 매너전략(마음가짐) 변경: "+this.strategy.getClass().getSimpleName()+" 장착 완료!~~");
		//getClass.getSimple
	}
	
	
	public void encountSituation(String situation) {
		System.out.println("[상황 발생!] : "+situation);
		
		//전략이 없다면(null)? - 생성자에다가 초기값을 넣어도된다. (기본적으로 잔다.)
		if(this.strategy == null) {
			System.out.println("현재 전략 없음! 무념무상! ");
			System.out.println("그냥 놀아요~~~~~ ");
			return;
		}
		
		//네가 가지고 있는 전략 동작을 수행해!!!!
		this.strategy.behave(situation);
	}
}

 

메인

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		짱구 a = new 짱구();
		
		//전략이 없을 때
		a.encountSituation("내일 갑자기 시험을 본다는 소식을 들었을 때 ");
		
		//1. 엄마가 심부를 시키고자 하는 상황
		a.setStrategy(new SleepStrategy());
		a.encountSituation("엄마가 귀찮은 심부름을 시키려고 할 때 ");
		
		//2. 훈이가 괴롭힘을 당하고 있는 상황
		a.setStrategy(new ActionMaskStrategy());
		a.encountSituation("훈이가 괴롭힘을 당해서 울고 있을 때 ");
		
		//3. 개구쟁이 짱구. 유치원에서 놀고 있는 상황
		
		a.setStrategy(new DanceStrategy());
		a.encountSituation("친구들이랑 놀이터에서 놀고 있을 때 ");
		
		//4. 엄마가 어려운 일을 시켰을 때
		a.setStrategy(new 철이Strategy());
		a.encountSituation("엄마가 쓰레기를 버리라고 말했을 때 ");
		
	}

}

 

콘솔 결과

 

실제로 철이Strategy()를 추가해보니 너무 편리하다는 것을 느꼈다.

 

전략 Strategy 패턴이란, 다양한 전략들을 만들고 context에 따라 전략을 선택해서 적용하는 것이다. 쉽게 전략 교체가 가능하고, 유지보수에 용이하다는 걸 느꼈다. 코드를 따라 쳐 보면서 생각났던 원칙들로는

 

- Single responsibility(단일 책임 원칙) : 이름만 봐도 뭐하는지 알 수 있도록 각각의 클래스들은 하나의 책임만 갖고 있다,

- Open/closed(개방/폐쇄 원칙) : 추가/확장에 개방적(철이Strategy 추가로 느낌)이고, 기존 코드들을 해치지 않는다(폐쇄적).

- Liscov substitution 리스코프 치환 원칙 : 모든 전략 interface의 하위 클래스들이 behave() 메소드를 잘 구현했다.

- Interface segregation 인터페이스 분리 원칙 : 클래스들의 상위에 인터페이스가 있어서 설계도 역할을 하고 있다.

- Dependency Inversion 의존성 역전 원칙 : 상속받지 않고 필드로 갖고 있고 외부에서 생성한 걸 주입 받는다.

 

확실히 solid 원칙이나 패턴을 배우지 않았던 예전에 위 실습 내용을 구현하려 했다면 if, else if, else 더미를 만들어서 구현했을 것이다. 그런 점에서 새삼 위대한 원칙들이라는 것을 느꼈다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함