게임을 예시로 들면 게임 캐릭터마다 공격 방식을 다르게 하고싶을때(궁수는 활로, 전사는 검으로, 격투가는 주먹으로)
이때 캐릭터들은 어떤 무기로 어떤 방식을 사용하던간에 공격을 한다
즉, 전략 패턴은 객체들이 할 수 있는 행위들 각각을 전략으로 만들고, 객체의 행위를 바꾸고 싶을때 직접 수정하는게 아니라, 전략을 바꾸는 것만으로 행위의 수정이 가능하도록 만든 패턴
public interface Movable {
public void move();
}
public class Train implements Movable{
public void move(){
System.out.println("선로 이동");
}
}
public class Bus implements Movable{
public void move(){
System.out.println("도로 이동");
}
}
public class Client {
public static void main(String args[]){
Movable train = new Train();
Movable bus = new Bus();
train.move(); // 기차는 선로로
bus.move(); // 버스는 도로로
}
}
기존 버스의 이동 방식을 수정하려면 어떻게 해야하는가?
새로운 탈것이 추가되고 이동 방식을 추가하거나 수정하려면 어떻게 하는가?
public void move(){
System.out.println("고속 도로 이동");
}
위 코드처럼 기존 Bus의 move()를 수정하면 될지 모른다
OCP에 따라 기존 코드의 변경없이 확장이 가능해야하는데 위 코드는 기존 move
를 직접 수정해버렸다
버스 말고도 택시, 오토바이, 비행기 등이 추가된다면? 선로를 이용한 오토바이, 고속도로를 이용하는 택시가 추가된다면?
public interface MovableStrategy {
public void move();
}
public class RailLoadStrategy implements MovableStrategy{
public void move(){
System.out.println("선로를 통해 이동");
}
}
public class LoadStrategy implements MovableStrategy{
public void move() {
System.out.println("도로를 통해 이동");
}
}
public class Moving {
private MovableStrategy movableStrategy;
public void move(){
movableStrategy.move();
}
// 어떤 방식으로 이동할것인가?
public void setMovableStrategy(MovableStrategy movableStrategy){
this.movableStrategy = movableStrategy;
}
}
public class Bus extends Moving{
}
public class Train extends Moving{
}
public class Client {
public static void main(String args[]){
Moving train = new Train();
Moving bus = new Bus();
/*
기존의 기차와 버스의 이동 방식
1) 기차 - 선로
2) 버스 - 도로
*/
train.setMovableStrategy(new RailLoadStrategy());
bus.setMovableStrategy(new LoadStrategy());
train.move();
bus.move();
/*
선로를 따라 움직이는 버스가 개발
*/
bus.setMovableStrategy(new RailLoadStrategy());
bus.move();
}
}
setter
를 통해 load를 외부에서 필요에 의해서 변경 가능하다https://velog.io/@y_dragonrise/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%A0%84%EB%9E%B5-%ED%8C%A8%ED%84%B4Strategy-Pattern
https://victorydntmd.tistory.com/292
https://hudi.blog/strategy-pattern/
https://inpa.tistory.com/entry/OOP-%F0%9F%92%A0-%EC%95%84%EC%A3%BC-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-OCP-%EA%B0%9C%EB%B0%A9-%ED%8F%90%EC%87%84-%EC%9B%90%EC%B9%99