본문으로 바로가기

디자인패턴 - 전략패턴

category 프로그래밍 언어/Java 2019. 8. 23. 16:35

Strategy(전략) 패턴

전략 패터는 말 그대로 전략적으로 짜서 전략 바꾸기 기법입니다.

즉 전략 패턴은 추상점을 만들어서 이 추상점(접근점)을 통해 서로 교환  가능하도록 하는 패턴입니다.

예를 들어서 게임 캐릭터가 칼, 도끼, 검이 있을 때 무기를 전략대로 사용할 수 있겠죠.

이를 위해서 인터페이스와 델리게이트(위임기법), 전략 패턴을 알아야합니다.

인터페이스는 선언과 구현을 분리해주고 기능 사용 통로 역할을 합니다. 

 

델리게이트(위임기법)은 전략패턴에 앞서서 예제를 통해 설명드리겠습니다.

어떤 것을 위임한다는 뜻으로 어떠한 기능이 필요하므로 이를 인터페이스를 통해서 위임하여 기능을 구현한다는 뜻입니다.

우선 AInterface.java와 이를 구현한 AInterfaceImpl.java가 아래와 같습니다.

package com.jeongchan.pattern;
/**
 * 스트래티지 패턴
 * @author dlwjd
 *
 */
public interface Ainterface {
	
	//기능에 선언
	public void funcA();
}
package com.jeongchan.pattern;
/**
 * 스트래티지 패턴
 * @author dlwjd
 *
 */
public class AinterfaceImpl implements Ainterface{

	@Override
	public void funcA() {
		// TODO Auto-generated method stub
		System.out.println("AAA");
	}

}

그 다음 AObj.java를 통해 이를 위임해봅시다.

package com.jeongchan.pattern;
/**
 * 델리게이트
 * @author dlwjd
 *
 */
public class AObj {
	
	Ainterface ainterface;
	
	public AObj() {
		ainterface = new AinterfaceImpl();
	}
	public void funcAA() {
		// TODO Auto-generated method stub
		
		//위임한다. 델리게이트 한다.
		ainterface.funcA();
		ainterface.funcA();
//		System.out.println("AAA");
//		System.out.println("AAA");

		// TODO ~기능이 필요합니다. 인터페이스를 선언 후 이를 위임한다.델리게이트
		
	}
}

즉 AAA를 출력하는 기능이 필요하므로 직접 sysout을 쓰지않고 Ainterface에 이 기능을 추가하고 이를 위임해줍니다.

이것이 델리게이트 개념입니다. 

인터페이스와 델리게이트 개념을 알면 전략패턴은 쉽습니다.

 

게임을 토대로 전략패턴을 설명하겠습니다.

우선 Weapon이라는 인터페이스를 만들어서 칼과 검이 이를 구현합시다.

package com.jeongchan.pattern;

public interface Weapon {
	
	public void attack();
}

이를 구현하는 Sword.java와 Knife.java입니다.

package com.jeongchan.pattern;

public class Sword implements Weapon {

	@Override
	public void attack() {
		// TODO Auto-generated method stub
		System.out.println("검 공격");
	}

}
package com.jeongchan.pattern;

public class Knife implements Weapon {

	@Override
	public void attack() {
		// TODO Auto-generated method stub
		System.out.println("칼 공격");
	}

}

이제 이를 위임받을 게임 캐릭터가 필요합니다. 전략패턴을 이용해서 GameCharacter.java를 만들어줍시다.

package com.jeongchan.pattern;
/**
 * 전략패턴
 * @author dlwjd
 *
 */
public class GameCharacter {
	
	//접근점
	private Weapon weapon;
	
	//교환 가능
	public void setWeapon(Weapon weapon) {
		this.weapon = weapon;
	}
	
	//공격 기술
	public void attack() {
		
		if(weapon == null) {
			System.out.println("맨손 공격");
		}else {
			//델리게이트
			weapon.attack();
		}
	
	}
}

즉 접근점인 인터페이스 Weapon을 통해서 위임받습니다. setWeapon은 교환 가능하도록 전략을 바꿀 수 있게 하는 메소드입니다. attack은 이제 위임받은 것을 통해 공격을 실행합니다.

 

이를 메인에서 구현하면

package com.jeongchan.pattern;

/**
 * 스트래티지 패턴
 * 
 * @author dlwjd
 *
 */
public class Main {

	public static void main(String[] args) {

		GameCharacter character = new GameCharacter();

		character.attack();// 맨손공격

		// 칼 공격
		character.setWeapon(new Knife()); //교환
		character.attack();// 맨손공격

		// 검 공격
		character.setWeapon(new Sword());
		character.attack();

	}
}
맨손 공격
칼 공격
검 공격