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 |