[자바와 객체 지향 그리고 스프링] 06. 전략 패턴

코린이서현이·2024년 1월 23일
0

📌 전략 패턴

전략패턴의 구성

전략패턴은 객체를 사용하는 컨텍스트는 클라이언트로부터 객체를 받아서 사용한다.
이때 주입해주는 객체, 켄텍스트가 사용하는 객체를 전략객체라고 부른다.
또한 전략 객체는 전략 메서드를 가진다.

클라이언트

전략 객체를 생성해 컨텍스트에 주입하는 클라이언트
제 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);
  }

실행화면

전투 시작
🔫
전투 종료
전투 시작
🗡️
전투 종료
아직 잘은 모르지만, 컨텍스트의 생성자에서 객체를 주입해줄 수도 있을 것이다!

전략패턴의 특징 : OCP, DIP

의존 역전 원칙

컨텍스트는 추상적인 Weapon인터페이스에 의존한다.

개방 폐쇄 원칙

  • 확장에 열려있다.
    인터페이스를 활용해 다양한 무기 구현체를 만들 수 있다. 또한 클라이언트에서 새로운 구현체를 사용할 수 있다.

  • 변경에 닫혀있다.
    새로운 구현체를 적용하더라도 컨텍스트의 코드를 변경할 필요 없다.

전략 패턴과 탬플릿 메서드 패턴?

같은 목적을 가지고 있다. 그러나 자바는 상속이라는 제한이 있기 때문에 전략 패턴을 더 많이 활용한다고 한다.

읽어보면 좋을 글

profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글