개발/DesignPatterns

1. Strategy Pattern(전략패턴)

huiyu 2014. 7. 3. 08:31

Strategy Design Pattern(스트래티지/전략패턴)


Define

- 알고리즘군을 정의하고 각각을 캡슐화하여 교환할 수 있도록 만든다. 전략패턴을 사용함으로써 클라이언트와 독립적으로 알고리즘을 변경할 수 있다.


Structure

Strategy scheme


- Strategy(전략) : 전략을 이용하기 위한 인터페이스를 결정,

- ConcreteStrategy(ImplementationOne, ImplementationTwo) : Strategy의 인터페이스를 실제로 구현, 실제 전략(알고리즘)을 프로그래밍한다.

- Context(문맥) : Context는 Strategy를 이용하는 역할, ConcreteStrategy의 인스터스를 가지고 있으며 그것을 이용.


Advantage

- 코드중복을 줄일 수 있다.

- 실행 시 행동을 바꿀 수 있다.

- 신규 알고리즘 추가가 용이하다.(확장성)

- 클라이언트와 독립적이기 때문에 알고리즘 변경에 용이하다.


Code-Java

- 캐릭터 객체가 존재하고 캐릭터는 무기를 가지고 있다. 무기에는 도끼, 칼, 검, 활 등이 있고, 무기에 따른 다른 공격을 한다. 각각 Attack()메소드에 따라 다르기 때문에 WeaponBehavior 인터페이스를 상속받은 각각의 객체에서 메소드를 구현한다.

- Character 객체에서 WeaponBehavior객체를 갖고 무기에 따라 다른 공격을 하게 된다.


Character class

public class Character {
	private WeaponBehavior weaponBehavior;
	
	public Character(WeaponBehavior weaponBehavior) {
		this.weaponBehavior = weaponBehavior;
	}
	
	public void fight(){
		weaponBehavior.attack();
	}
	
	public void setWeapon(WeaponBehavior weaponBehavior)
	{
		this.weaponBehavior = weaponBehavior;
	}
}


WeaponBehavior class

public interface WeaponBehavior { public void attack(); } class AxeBehavior implements WeaponBehavior{ @Override public void attack() { System.out.println("도기질"); } } class SwordBehavior implements WeaponBehavior{ @Override public void attack(){ System.out.println("검질"); } } class KnifeBehavior implements WeaponBehavior{ @Override public void attack(){ System.out.println("칼질"); } } class BowAndArrowBehavior implements WeaponBehavior{ @Override public void attack(){ System.out.println("화살 발사!"); } }


Main Class

public class Main { public static void main(String[] args) { //칼 휘두르는 캐릭터 생성! Character character1 = new Character(new KnifeBehavior()); character1.fight(); //도끼를 휘두르는 캐릭터 생성 Character character2 = new Character(new AxeBehavior()); character2.fight(); //도끼에서 활로 무기 변경 character2.setWeapon(new BowAndArrowBehavior()); character2.fight(); } }


--실행결과-------------------

칼질

도끼질

화살발사!

-----------------------------

+ Strategy를 이용하면 프로그램을 복잡하게 만든느 것처럼 보이지만 실제로는 그렇지 않다. 예를 들어 알고리즘을 개량할 때, strategy패턴을 사용하면 strategy역할의 인터페이스를 변경하지 않고, ConcreteStrategy의 알고리즘만 수정하면 된다. 위임이라는 느슨한 연결을 사용하고 있으므로 알고리즘을 용이하게 교환할 수 있다.

+ 실행중에도 교환가능


참고

http://sourcemaking.com/design_patterns/strategy

HeadFirst DesignPatterns

Java언어로 배우는 디자인 패턴

728x90
반응형