Louie NRT Story

[디자인패턴] 전략(Strategy) 본문

전기차충전기

[디자인패턴] 전략(Strategy)

hyeok0724.kim@gmail.com 2022. 5. 22. 17:32
반응형

작성일: 22년 5월 22일

 

Index

1. 배경

2. Before - SearchButton 코드, Enum Mode 코드

3. Before - MyProgram 코드

4. Before - 코드의 문제점

5. After - Strategy 코드

6. After - SearchButton 코드

7. After - MyProgram 코드

8. After의 장점

 

 

1. 배경

 - 전체, 이미지, 뉴스, 지도 탭을 선택하는 것에 따라 검색이 다르게 됨

 

 

2. Before - SearchButton 코드, Enum Mode 코드

public enum Mode {
    ALL, IMAGE, NEWS, MAP
}
public class SearchButton {
    private MyProgram myProgram;

    public SearchButton (MyProgram _myProgram){
        myProgram = _myProgram;
    }

    public void onClick() {
        switch(myProgram.mode){
            case ALL:
                System.out.println("SearchButton() -> Search ALL");
            case IMAGE:
                System.out.println("SearchButton() -> Search IMAGE");
                break;
            case NEWS:
                System.out.println("SearchButton() -> Search NEWS");
                break;
            case MAP:
                System.out.println("SearchButton() -> Search MAP");
                break;
        }
    }
}

 

 

3. Before - MyProgram 코드

 - searchButton의 onClick() 함수를 통하여 검색버튼을 누를 때 Mode의 값에 따라 동작이 달라짐

public class MyProgram {
    private SearchButton searchButton = new SearchButton(this);

    public Mode mode = Mode.ALL;
    public void setModeAll() { mode = Mode.ALL; }
    public void setModeImage() { mode = Mode.IMAGE; }
    public void setModeNews() { mode = Mode.NEWS; }
    public void setModeMap() { mode = Mode.MAP; }
}

 

 

4. Before - 코드의 문제점

 - Mode가 ALL, Image, News, Map 외에 늘어나게 되면 onClick() 함수와 setMode 함수를 추가해야함

 

//========================================================================

 

5. After - Strategy 코드

 - Interface를 통하여 상속을 하고 해당 Class에서 search()가 실행 하도록 하

interface SearchStrategy {
    public void search();
}

class SearchStrategyAll implements SearchStrategy {
    public void search(){
        System.out.println("SEARCH ALL");
    }
}

class SearchStrstegyImage implements SearchStrategy {
    public void search() {
        System.out.println("SEARCH IMAGE");
    }
}

class SearchStrategyNews implements SearchStrategy {
    public void search() {
        System.out.println("SEARCH NEWS");
    }
}

class SearchStrategyMap implements SearchStrategy {
    public void search() {
        System.out.println("SEARCH MAP");
    }
}

 

 

6. After - SearchButton 코드

public class SearchButton {
    private MyProgram myProgram;

    public SearchButton(MyProgram _myProgram){
        myProgram = _myProgram;
    }

    private SearchStrategy searchStrategy = new SearchStrategyAll();

    public void setSearchStrategy(SearchStrategy _searchStrategy) {
        searchStrategy = _searchStrategy;
    }

    public void onClick(){
        searchStrategy.search();
    }
}

 

 

7. After - MyProgram 코드

public class MyProgram {

    private SearchButton searchButton  = new SearchButton(this);

    public void setModeAll(){
        searchButton.setSearchStrategy(new SearchStrategyAll());
    }

    public void setModeImage() {
        searchButton.setSearchStrategy(new SearchStrstegyImage());
    }

    public void setModeNews() {
        searchButton.setSearchStrategy(new SearchStrategyNews());
    }

    public void setModeMap(){
        searchButton.setSearchStrategy(new SearchStrategyMap());
    }

    public void testProgram(){
        searchButton.onClick();
        setModeImage();
        searchButton.onClick();
        setModeNews();
        searchButton.onClick();
        setModeMap();
        searchButton.onClick();
    }
}

 

 

8. After의 장점

 - 검색 방법이 변경 될때마다 새로운 Strategy를 갈아 끼우면 됨

 - 검색 방법이 추가 될때도 Strategy만 추가하면 되므로 확장성이 용이함

 - 옵션들 마다의 행동을 모듈화하여 독립적이고 상호 교체 가능하도록 하는 것임

 

Referece:

https://www.youtube.com/watch?v=lJES5TQTTWE&t=564s 

 

반응형
Comments