Strategy Pattern

2024. 1. 10. 21:35디자인 패턴

Strategy Pattern이란

Strategy Pattern이란 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화하는 인터페이스를 정의하여 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 젼략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법을 말합니다.
간단히 말해서 객체가 할 수 있는 행위들 각각을 전략으로 만들어 놓고 동적으로 행위의 수정이 필요한 경우 전략을 바꾸는 것만으로 행위의 수정이 가능하도록 만든 패턴입니다.

Strategy Pattern

예를 들어, 기차와 버스 클래스가 있고, 이 두 클래스는 Movable 인터페이스를 구현하다고 가정하겠습니다. 그리고 버스와 기차 객체를 사용하는 Client도 있습니다.

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

기차는 선로를 따라 이동하고, 버스는 도로를 따라 이동합니다.
그러다 선로를 따라 움직이는 버스가 개발되었다고 가정해봅니다.

가장 간단한 방법은 Bus의 move() 메서드를 수정하는 것입니다. 하지만 이 방법은 OCP(Open-Closed Pricipal)에 위배됩니다. OCP에 의하면 기존의 move를 수정하지 않으면서 행위가 수정되어야하기 때문입니다.
또한 이러한 방식의 경우 시스템이 확장되었을 때 유지보수가 어려워집니다. 예를 들어 자가용, 고속버스, 오토바이 등이 추가되고 모두 '도로를 통해 이동'을 출력하는 move() 메서드를 사용하게 되면 코드의 중복이 발생합니다. 그리고 새로 생긴 자가용, 고속버스등의 이동이 변경된다면 일일이 수정해야하는 번거로움도 발생합니다.

이러한 방식을 해결하기 위해, 행위에 대해 전략클래스를 생성하는 Strategy Pattern을 통해 이 문제를 해결합니다.

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{

}

https://victorydntmd.tistory.com/292

728x90

'디자인 패턴' 카테고리의 다른 글

Composite Pattern  (0) 2020.07.03
Factory Pattern  (0) 2020.05.06
Chain Of Responsibility  (0) 2020.05.02
Observer Pattern  (0) 2020.05.02
Template Method Pattern  (0) 2020.05.01