전략패턴은 객체를 사용하는 컨텍스트는 클라이언트로부터 객체를 받아서 사용한다.
이때 주입해주는 객체, 켄텍스트가 사용하는 객체를 전략객체라고 부른다.
또한 전략 객체는 전략 메서드를 가진다.
전략 객체를 생성해 컨텍스트에 주입하는 클라이언트
제 3자, 전략객체의 공급자.
전략 객체를 클라이언트로 주입받아 전략객체의 전략 메서드를 사용하는 컨택스트
전략 객체의 사용자, 소비자이다.
컨텍스트는 어떤 전략 객체가 들어올지 모른다.
전략메서드를 가진 전략 객체
🤔 그러면 여러 전략 객체가 있겠지? -> 전략 객체의 인터페이스가 필요!
인터페이스
package OOP06.strategyPattern;
public interface Weapon {
abstract void useWeapon();
}
package OOP06.strategyPattern;
public class WeaponGun implements Weapon{
@Override
public void useWeapon() {
System.out.println("🔫");
}
}
package OOP06.strategyPattern;
public class WeaponSword implements Weapon{
@Override
public void useWeapon() {
System.out.println("🗡️");
}
}
클라이언트로부터 객체를 주입받는다.
package OOP06.strategyPattern;
public class Soldier {
void fight_Against(Weapon weapon){
System.out.println("전투 시작");
weapon.useWeapon();
System.out.println("전투 종료");
}
}
컨텍스트에 객체를 주입한다.
package OOP06.strategyPattern;
public class Client {
public static void main(String[] args) {
Weapon weapon = null;
Soldier soldier = new Soldier();
weapon = new WeaponGun();
soldier.fight_Against(weapon);
weapon = new WeaponSword();
soldier.fight_Against(weapon);
}
실행화면
전투 시작
🔫
전투 종료
전투 시작
🗡️
전투 종료
아직 잘은 모르지만, 컨텍스트의 생성자에서 객체를 주입해줄 수도 있을 것이다!
컨텍스트는 추상적인 Weapon
인터페이스에 의존한다.
확장에 열려있다.
인터페이스를 활용해 다양한 무기 구현체를 만들 수 있다. 또한 클라이언트에서 새로운 구현체를 사용할 수 있다.
변경에 닫혀있다.
새로운 구현체를 적용하더라도 컨텍스트의 코드를 변경할 필요 없다.
같은 목적을 가지고 있다. 그러나 자바는 상속이라는 제한이 있기 때문에 전략 패턴을 더 많이 활용한다고 한다.