디자인 패턴

변경되는 요구사항들에 문제를 어떻게 해결해 나갈 것인지에 대한 해결방안 모음들 :: 정답이 아님

전략 패턴

행위 분류하여 미리 만들어 놓고 상황에 따라 알맞게 선택해서 사용하는 패턴

만약, 변경사항이 생기더라도 새로운 행위를 만들면 됨

  • keyword : 많은 수정사항
public interface Vehicle {
    public void run();
}

public class Subway implements Vehicle {
    @Override
    public void run() {
        System.out.println("선로 위를 달린다.");
    }
}

public class Bus implements Vehicle {
    @Override
    public void run() {
        System.out.println("도로 위를 달린다.");
    }
}

위와 같이 설계를 진행했다면 무슨 문제가 발생할까?

만약, 버스(Bus)가 물 위를 달릴 수 있게 발명되었다고 한다면 어떻게 될까?

버스의 문구를 수정해야 할 것이다.

// 수정
@Override
public void run() {
    System.out.println("도로 위를 달린다.");
}

한 번만 수정하니 편리한 듯하다.

그런데 도로 위를 달리던 교통수단들이 물 위를 달릴 수 있게 된다면 어떻게 될까?

모든 교통수단들의 문구들을 일일이 수정해야 할 것이다.

그렇다면 얼마나 바뀌어야 하는가? 교통수단들 만큼 바뀌어야 모든 것을 해결 할 수 있지 않은가?

얼마나 비효율적인가 따라서 상황에 맞게 변경되는 것들을 미리 만들어 전략에 따라 바꿀 수 있도록 해야할 것이다.

아래의 코드들을 보자

행위들의 모음

public interface Way {
    public void run();
}

public class WaterWay implements Way {
    @Override
    public void run() {
        System.out.println("물 위를 달린다.");
    }
}

public class TrackWay implements Way {
    @Override
    public void run() {
        System.out.println("선로 위를 달린다.");
    }
}

public class RoadWay implements Way {
    @Override
    public void run() {
        System.out.println("도로 위를 달린다.");
    }
}

실제 구현 클래스들

public abstract class Transportation {
    protected Way way;

    public void performRun() {
        way.run();
    }

    public void stop() {
        System.out.println("멈춤");
    }

    public void setWay(Way way) {
        this.way = way;
    }
}

public class Subway extends Transportation {
    public Subway(Way way) {
        this.way = way;
    }
}

public class Bus extends Transportation {
    public Bus(Way way) {
        this.way = way;
    }
}

public class Taxi extends Transportation {
    public Taxi(Way way) {
        this.way = way;
    }
}

// 변경 전
Subway subway = new Subway(new TrackWay());
subway.performRun(); // 선로 위를 달린다.

Bus bus = new Bus(new RoadWay());
bus.performRun(); // 도로 위를 달린다.

Taxi taxi = new Taxi(new RoadWay());
taxi.performRun(); // 도로 위를 달린다.

// 변경 후
subway.setWay(new WaterWay());
subway.performRun(); // 물 위를 달린다.

bus.setWay(new WaterWay());
bus.performRun(); // 물 위를 달린다.

taxi.setWay(new WaterWay());
taxi.performRun(); // 물 위를 달린다.

만약, 교통수단들이 갑자기 하늘을 날 수 있게 바뀐다면 행동 클래스를 추가하면 된다.

public class FlyWay implements Way {
    @Override
    public void run() {
        System.out.println("하늘 위를 달린다.");
    }
}

댓글남기기