자바 디자인패턴(1), 전략 패턴(Strategy pattern)

2022. 9. 30. 14:52자바/디자인패턴

728x90
반응형

전략 패턴(Strategy pattern)

여러 알고리즘을 하나의 추상적인 접근점(인터페이스)을 만들어서 접근점에서 서로 교환 가능하게 만든다.

 

 

클라이언트는 전략을 소유하고 있다. 전략은 각각 A, B, C가 있고, Strategy는 인터페이스로 구현한다.

클라이언트는 Strategy를 직접 호출해 StrategyA, StrategyB, StrategyC를 모두 사용할 수 있다.

 

요구 사항

신작 게임에서 캐릭터와 무기를 구현해보기

- 무기는 '칼', '검' 두 종류가 있다.

 

=> 칼과 검은 각각 알고리즘의 대상이되어 무기는 하나의 인터페이스로 존재할 수 있다. 따라서 이는 전략패턴으로 구현할 수 있다.

 


무기 인터페이스 선언

// Weapon.java
public interface Weapon {
	public void attack();
}

무기 인터페이스는 attack()이라는 메서드가 존재한다.

 

 

Knife 구현

// Knife.java

public class Knife implements Weapon {
	
	@Override
	public void attack() {
		System.out.println("칼 공격");
	}
}

 

Sword 구현

// Sword.java

public class Sword implements Weapon {
	public void attack() {
		System.out.println("검 공격");
	}
}

 

 

Fist 구현

// Fist.java

public class Fist implements Weapon {
	public void attack() {
		System.out.println("맨손 공격");
	}
}

초기 캐릭터 인스턴스를 생성할 때 기본적으로 맨손이라고 가정하여 Fist 클래스 또한 만들었다.

 

 

 

GameCharacter 클래스 구현

// GameCharacter.java

public class GameCharacter {
	
	public GameCharacter() {
		weapon = new Fist();
	}
	
	// 접근점
	private Weapon weapon;
	
	// 교환가능
	public void setWeapon(Weapon weapon) {
		this.weapon = weapon;
	}
	
	public void attack() {

		// 델리게이트 -> 어떤 무기를 들고 있는지에 따라 공격되는 형태가 달라진다.
		weapon.attack();
	}
}

weapon은 델리게이트로 사용하여 어떤 무기를 들고 있는 지에 따라 공격되는 형태가 달라진다. 이는 interface를 has하고 있다.

 

 

Main

// Main.java

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();
		
	}
}

 

출력

맨손 공격
칼 공격
검 공격

 


유지 보수 요청

무기 중 도끼를 추가하시오.

 

=> 전략 패턴은 인터페이스를 수정하지 않기에 새로운 세부 전략이 추가되는 경우에는 기존의 내용을 수정할 필요없이 기능만 추가할 수 있다.

 

 

 

Ax 구현

// Ax.java

public class Ax implements Weapon {
	
	@Override
	public void attack() {
		System.out.println("도끼 공격");
	}
}

 

 

Main

// Main.java

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();
		
		character.setWeapon(new Ax());
		character.attack();
	}
}

 

출력

맨손 공격
칼 공격
검 공격
도끼 공격

 

출처: https://www.youtube.com/watch?v=UEjsbd3IZvA 

 

728x90
반응형