본문 바로가기
Dev/etc

전략패턴

by 펭귄안에 온천 2022. 12. 2.
728x90
반응형

AS-IS

public interface Bus {
    public void move();
}

public class TownBus implements Bus{
    public void move(){
        System.out.println("도로를 주행함");       
    }
}
public class ExpressBus implements Bus{
    public void move(){
        System.out.println("도로를 주행함");       
    }
}
public class CityBus implements Bus{
    public void move(){
        System.out.println("도로를 주행함");
    }
}
public class test {
    public static void main(String[] args) {
        Bus city = new CityBus();
        Bus Express = new ExpressBus();
        Bus Town = new TownBus();

        city.move();
        Express.move();
        Town.move();

        /* 
        도로를 주행함
        도로를 주행함
        도로를 주행함
        */
    }
}

고속버스, 마을버스 , 시내버스 모두 도로를 주행하다가 이제 고속버스는 고속도로만 주행 할수 있게 된다면?
ExpresssBus의 move()를 수정해주면 된다.

그러나 이것은 객체지향 개발 5대 원리 SOLID를 의 2번재 OCP(개방 폐쇠의 원칙 ) 을 위배한다.!

개방 폐쇠의 원칙 : 확장에는 열려있고, 변경에는 닫혀있어야 한다

요구사항의 변경이나 추가 사항이 발생하더라도, 기존 구성요소는 수정이 일어나지 말아야 하며,
기존 구성요소를 쉽게 확장해서 재사용 할 수 있어야 한다!!

그렇다면 ExpressBus Move()를 수정하는것은 OCP를 위배하는것!

그리고 만약에 고속버스 뿐만아니라 여러가지 버스가 모두 고속도로를 주행한다면
그 많은 버스들의 move()를 전부 수정해준다? 그것도 오바고

전략패턴

객체들이 할 수 있는 동작을 각각의 전략으로 만들고 동적으로 변경해야 한다면 전략만 변경하여 동작이 변경되게 함으로써 동작을 유연하게 확장하는 방법

TO-BE With 전략패턴

public interface MoveStrategy {
    public void move();
}
public class LocadStrategy implements MoveStrategy{
    public void move(){
        System.out.println("도로 주행");
    }
}
public class RapitStrategy implements MoveStrategy{
    public void move(){
        System.out.println("고속주행");
    }
}
public class Bus {

    //만약 스프링이라면 오토와이즈로 의존성을 주입했겠지
    private MoveStrategy moveStrategy;
    public void setMoveStrategy(MoveStrategy moveStrategy){
        this.moveStrategy = moveStrategy;
    }

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

}
public class ExpressBus extends Bus{
}
public class TownBus extends Bus{
}
public class CityBus extends Bus{
}
public class test {
    public static void main(String[] args) {
        Bus city = new CityBus();
        Bus Express = new ExpressBus();
        Bus Town = new TownBus();

        Express.setMoveStrategy(new RapitStrategy());
        city.setMoveStrategy(new LocadStrategy());
        Town.setMoveStrategy(new LocadStrategy());

        Express.move();
        city.move();
        Town.move();

        /* 결과
        고속주행
        도로 주행
        도로 주행
        */
    }
}

이러면 ExpressBus의 move()를 수정하지 않고
기존의 LoadStrategy 전략으로 도로 주행만 하고있다가 RapitStrategy전략을 추가해서 고속도로도 달릴 수 있게 했다.

수정은 하지 않고 확장,추가를 사용했으니깐 OCP도 잘 지키고 .

반응형

'Dev > etc' 카테고리의 다른 글

데이터 중심 아키텍처(DB/SQL 중심)  (0) 2023.02.08
데코레이터 패턴  (0) 2022.12.02
TDD에서 테스트 문서 대체 가능이란?  (0) 2022.10.30
Semantic Versioning  (0) 2022.10.01
분산컴퓨팅  (0) 2022.08.31