DESIGN PATTERN

[디자인패턴] 전략패턴 (strategy Pattern)이란? - 개발자 배찌

개발자 배찌 2022. 4. 12. 11:29
728x90

😀전략패턴이란?
객체의 행위를 동적으로 바꾸고 싶은 경우, 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법을 말한다.

객체가 할 수 있는 행위들 각각을 전략으로 만들어 놓고, 동적으로 행위의 수정이 필요한 경우 전략을 바꾸는 것만으로 행위의 수정이 가능하도록 만든 패턴.

메서드내의 기능구현을 수정하고 싶을 때, 직접 그 코드에 찾아가 수정하게 된다면, 그 메서드를 사용하는 다른 코드들에게 영향을 끼치게 된다. 이는 SOLID의 원칙 중, OCP(Open-Closed Principle)에 위배됨!!

이러한 문제점을 해결하기 위한 패턴이 "전략패턴"이다.


😀코드로 알아보기!!

Moving.java

package study.strategyPattern.code0;

public class Moving {

    private MovableStrategy movableStrategy;

    public Moving(MovableStrategy movableStrategy){
        this.movableStrategy = movableStrategy;
        move();
    }

    public void move(){
        movableStrategy.move();
    }
}


Bus.java

package study.strategyPattern.code0;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Bus extends Moving{


    public Bus(MovableStrategy movableStrategy) {
        super(movableStrategy);
        transportation();
    }

    void transportation(){
        log.info("이동수단은 Bus 입니다.");
    }
}


MovableStrategy.java

package study.strategyPattern.code0;

public interface MovableStrategy {
    void move();
}


LoadStrategy.java

package study.strategyPattern.code0;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class LoadStrategy implements MovableStrategy{
    @Override
    public void move() {
        log.info("도로를 통해 이동");
    }
}


RailLoadStrategy.java

package study.strategyPattern.code0;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class RailLoadStrategy implements MovableStrategy{

    @Override
    public void move() {
        log.info("선로를 통해 이동");
    }
}


StrategyPatternTest.java

package study.strategyPattern;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import study.strategyPattern.code0.Bus;
import study.strategyPattern.code0.LoadStrategy;
import study.strategyPattern.code0.Moving;
import study.strategyPattern.code0.RailLoadStrategy;

@Slf4j
public class StrategyPatternTest {
    @Test
    void code0test(){
        log.info("bus1의 이동수단을 도로로 설정");
        Moving bus1 = new Bus(new LoadStrategy());
        log.info("=============================");

        log.info("bus1의 이동수단을 선로로 변경하고 싶을 때, 내부 코드 변경 없이 한 코드만 수정하여 변경가능");
        Moving bus2 = new Bus(new RailLoadStrategy());
        log.info("=============================");
    }
}