DESIGN PATTERN

[DESIGN PATTERN] STRATEGY PATTERN

본듀 2023. 1. 20. 10:39

전략 패턴은 전략을 쉽게 바꿀 수 있도록 해주는 디자인 패턴이다.

전략이란, 
어떤 목적을 달성하기 위해 일을 수행하는 방식 정도로 이해할 수 있다.

예제를 통해 전략패턴을 알아보자.

public class Robot {
	private String name;
    
	public Robot(String name) {
    	this.name = name;
    }
    
    public void move() {
    	System.out.println("I can only walk");
    }
}

위와 같은 Robot 클래스가 있을 때, Robot은 걸어서 움직일 수 밖에 없다.
만약 Robot이 날 수도 있게 만들고 싶다면 어떻게 해야할까?

public void move() {
	System.out.println("I can fly");
}

위와 같이 Robot 클래스내의 move() 메서드를 수정해야할 것이다.
그렇게 되면 SOLID 원칙 중 OCP를 위반하게 된다. 

또한, Robot 외의 움직임을 갖는 클래스들이 여럿 있다고하면 움직임에 대한 중복된 코드들이 쌓여갈 것이다.
중복된 코드는 일관성 있게 관리하는 것은 많은 노력을 요구하기 때문에

위 두 가지 문제점을 해결할 방안이 필요하다.

객체의 움직임에 대해 걷기, 날기와 같이 구체화된 값을 가지기 보다는
추상화된 값을 가지는 필드를 만들어준다.

public class Robot {
	private String name;
    private MovingStrategy movingStrategy;

	public Robot(String name) {
    	this.name = name;
    }
    
    public void move() {
    	movingStrategy.move{};
    }
    
    public void setMovingStrategy(MovingStrategy movingStrategy) {
    	this.movingStrategy = movingStrategy;
    }
}
public interface MovingStrategy {
	public void move();
}

public class WalkingStrategy implements MovingStrategy {
	public void move() {
    	System.out.println("I can only walk");
    }
}
public class Client {
	Robot robot = new Robot("robot1");
    robot.setMovingStrategy(new WalkingStrategy());
}

위와 같이 인터페이스를 이용해 움직임을 추상화하고  구체화된 움직임을 Robot 객체의 움직임으로 설정하면
움직임이 바뀔 때마다 기존의 코드는 바뀌지 않고, 새로운 코드를 추가함으로 객체의 움직임을 변경할 수 있다.

'DESIGN PATTERN' 카테고리의 다른 글

[DESIGN PATTERN] SOLID 원칙 (객체지향 5대원칙)  (0) 2022.12.14