[Java] 디자인 패턴, Strategy에 대해서 알아보자

     

     

     

    📋 전략 패턴

    • 객체의 행동으로 캡슐화
    • 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경 가능한 행동패턴
    • 동일 계열의 알고리즘군을 정의
    • 각 알고리즘을 별도의 클래스로 캡슐화
    • 이들을 서로 교체 가능하도록 만든다.
    • 클라이언트와 알고리즘 자체의 구현 사이의 결합도를 최소화

     

     

    전략 패턴이란, 서울에서 부산에 간다고 가정을 했을 때 우리가 선택할 수 있는 방법은 다양할 수 있습니다.

    버스, 기차, 자전거 등 여러 가지가 존재합니다.

     

    여기서 비용을 최소화 한다면 자전거를 탈 것이고, 시간을 최소화한다면 기차를 탈 것입니다.

    이 처럼 상황에 따라서 사용하는 객체가 달라질 수 있는데 이를 Strategy 패턴이라고 부릅니다.

     

     

     

    💭 구성 요소

    요소 설명
    Context ( 문맥 ) 전략을 사용하는 역할
    전략을 이용하여 특정 작업을 수행
    Stratrgy Interface ( 전략, 추상화 ) 모든 전략 클래스에서 구현해야하는 인터페이스
    Concrete Strategy ( 전략, 구체적 ) 전략 인터페이스를 구현하는 클래스
    실제 알고리즘을 제공

     

     

     

     

    💭 코드 보기

     

     

    StrategyInterface

    public interface StrategyInterface {
    
        void execute(String message);
        void print();
    }

     

     

    ConcreteStrategy - A

    public class ConcreteStrategyA implements StrategyInterface {
    
        private String message;
        private String color;
        public ConcreteStrategyA(String color) {
            this.color = color;
        }
    
        @Override
        public void execute(String message) {
            this.message = message;
        }
    
        @Override
        public void print() {
            System.out.println(color+" 사과의 메세지: "+message);
        }
    }

     

     

    ConcreteStrategy - B

    public class ConcreteStrategyB implements StrategyInterface {
    
        private String name;
        private int cnt;
        private String message;
    
        public ConcreteStrategyB(String name, int cnt) {
            this.name = name;
            this.cnt = cnt;
        }
    
        @Override
        public void execute(String message) {
            this.message = message;
        }
    
        @Override
        public void print() {
            System.out.println("그의 이름은 "+name);
            System.out.println("Banana의 갯수: "+cnt);
            System.out.println("message: "+message);
        }
    }

     

     

    Context

    public class Context {
        StrategyInterface strategy;
    
        public Context(StrategyInterface strategy) {
            this.strategy = strategy;
        }
    
        public void execute(String message) {
            strategy.execute(message);
        }
    
        public void print() {
            strategy.print();
        }
    }

     

     

    Main

    public class Main {
        public static void main(String[] args) {
            Context context = new Context(new ConcreteStrategyA("파랑색"));
            context.execute("Hello World");
            context.print();
    
            context = new Context(new ConcreteStrategyB("슈퍼맨", 100));
            context.execute("HI");
            context.print();
        }
    }

     

    코드를 실행하다보니 하나를 깨닫게 되었습니다.

    동적 바인딩.  이는 Java의 동적바인딩 개념을 이용해서 만든 패턴이라는 점 입니다..

     

    여기서 Context를 이용해서 좀 더 수월한 코딩이 만들어질 수 있도록 만든 것이 Strategy 패턴이 아닐까 싶었습니다.

     

     

    💭 Strategy 패턴 장점

    1. 캡슐화 분리

    • 알고리즘을 별도의 클래스로 캡슐화
    • 알고리즘의 구현을 사용하는 코드로부터 분리
    • 알고리즘을 독립적으로 개발하고 테스트할 수 있다.

    2. 교체

    • 프로그램을 실행하는 도중에도 전략을 쉽게 바꿀 수 있다.
    • 다양한 시나리오에 따라 적절한 알고리즘을 선택할 수 있게 된다.

    3. 확장성

    • 새로운 전략을 추가하는 것이 간단하다.
    • 기존 코드를 변경하지 않고 새로운 알고리즘 클래스를 만들어 기존 전략 인터페이스를 구현
    • 개방/폐쇄 원칙을 따른다.

    4. 상호 교환성

    • 관련 안고리즘들을 서로 교체하면서 사용할 수 있어서 프로그램의 유연성이 증가

    5. 단순성

    • 복잡한 조건문 로직을 간소화할 수 있다.
    • 알고리즘의 선택 로직을 Context 객체에서 제거하고 적절한 전략 객체에 위임함으로써 코드를 더욱 명확하고 관리하기 쉽게 만든다.

    6. 테스트 용이

    • 각 전략을 독립적으로 테스트할 수 있다.
    • 유닛 테스트의 적성과 유지보수를 용이하게 하여 전체 시스템의 안정성을 높일 수 있다.

     

     

    💭 의문, Observer와 Strategy의 차이

    사실 여기서 의문이 들었습니다. Observer와 Strategy는 각각 Subject와 Context에게 서로의 Interface를 맡겨서 동적바인딩 개념으로 접근을 한다는 부분입니다.

     

    그래서 어떻게보면 서로 비슷한 것이 아닌가 생각이 들었지만 해당 패턴은 사용하는 이유에 따라서 명칭이 갈리게 된다는 것을 알았습니다.

     

     

    1. 목적

    Observer패턴은 상태 변화를 관찰하고 이에 대한 알림을 주는 것에 초점을 둔다.

    Strategy패턴은 알고리즘의 교체와 실행 방법의 유연성에 초점을 둔다.

     

     

    2. 구조와 상호 작용

    Observer패턴은 Subject가 여러 Observer에게 통지하는 방식

    Strategy패턴은 Context가 필요에 따라 다른 Strategy를 사용할 수 있도록 함.

     

     

    💭 Strategy 패턴 사용하기

    동적 바인딩을 잘 안다는 기준으로, 각 회원별 등급별마다 실행하는 조건이 다를 때 사용하는 게 아닌가 싶습니다.

    결국 하나의 결과를 위한 동작을 수행할테지만 그 과정은 결코 같지 않기 때문 입니다.

     

    가장 큰 예시로, 사이트의 관리자와 일반계정의 차이 입니다.

    이들의 로그인에 대한 결과는 같더라도, 그 도중에 일어나는 과정에 대해서는 차이가 존재합니다.

     

    이처럼 상황에 따라서 사용할 수 있는 것이 Strategy 패턴이 아닌가 생각됩니다.

    반응형

    댓글

    Designed by JB FACTORY