본문 바로가기

객체지향 디자인 패턴

2. Strategy Pattern

전략 패턴은 언제 쓰이나?
1. 실행시간에 클라이언트 클래스가 가지는 하나 혹은 다수의 종류의 전략을 실행시간에 변경하고자 할때.
2.한 클래스가 여러 행위를 조건문을 통해 정의할때 

 

(수업시간에 전략패턴이 쓰이는 경우의 대표적인 경우가 한클래스가 여러행위를 조건문을 통해 정의해야 할 경우에 전략패턴이 쓰인다고 배웠다. 아래 유튜브 영상에서 제시하는 경우가 이 경우에 해당한다. SearchButton이라는 클래스  내에 여러행위가 조건문을 통해 정의되어 있음)


전략 패턴의 형식은 어떻게 되나?
각각의 전략을 클라이언트 클래스와 분리하여 전략 인터페이스와 전략 클래스로 구현하고 클라이언트 클래스(Context class)들은  느슨한 결합을 위해 그 전략 인터페이스를 맴버로 갖는다(has-a)

 

 


이러한 검색화면을 만든다고 가정해보자. 버튼중 하나를 눌러서 모드를 선택하고 선택된 모드에 따라 검색 버튼을 누르면 실행되는 검색의 방식이 결정되도록 하려고 한다. 즉, 프로그램 실행중 모드가 바뀜에 따라 검색이 이루어지는 방식, 즉 전략이 수정된다는 것입니다!

 

 

패턴을 적용하지 않은 단순코드

버튼들이 각각 메서드들을 실행한다고 가정하고 패턴을 적용하지 않고 단순코딩하면 위와 같이됨.

현재 어떤 모드가 선택되어 있는지 나타내는 변수mode

버튼이 눌릴때 마다 mode변수의 값이 변함.

그리고 검색버튼이 눌려 검색버튼 객체인 searchButton의 메서드인 onClick메서드가 실행되면 mode에 어떤 값이 들어있는가에 따라서 if문안에서 그에맞는 동작이 실행됨.

 

각각의 버튼에서 수정사항이 생기거나 혹은 새로운 버튼이 추가된다면 SearchButton클래스의 onClick메서드를 그때그때 수정해 주어야함. OCP원리를 다시 리마인드 한다면 이러한 설계는 좋지 못한 설계다. 왜? Open for extention Close for modification이므로!!! ==>> 이를 좀더 자세히 말하면 소프트웨어가 커질수록 코드를 분석하고 관리하기가 어려워짐(지금은 이해하기 힘들지만 코드내의 어떤것이 다른 어떤것과 연결되어지기 때문에 이렇게 수정하면 관리가 어렵다고 하는 것 같음). 또한 클래스마다 역할지정을 뚜렷하게 하여 모듈화된 소프트웨어를 구축(SRP: Single Responsibility Principle)해 나가야 하는 객체지향의 철학에도 어긋납니다. 

 

Strategy pattern은 모드 마다의 동작하나하나를 모듈로 따로 분리해서 모드 버튼을 누를때마다 검색 버튼을 누를때 실행될 검색모듈을 바꾸어 넣어주는 방식으로 코드를 구성하는 것입니다. 

아래는 전략패턴으로 짠 코드.onClick메서드가 간단해짐. 인터페이스를 따로 하나 만들고 각각의 모드마다 실행될 행동들을 독립적인 클래스로 하나하나 따로 만듬.

 

 

각각의 버튼들의 역할은 MyProgram 클래스에 있는 setModeAll, setModeImage,... 의 함수의 역할을 함. 즉, 버튼을 누르면 setMode~함수가 호출되고 그 안에서 버튼의 setSearchStrategy메서드가 호출되어 searhStrategy의 값이 변하게 됨. 따라서 만약에 이미지 검색의 방식이 변경되면 해당클래스인 SearchStrategyImage클래스를 찾아 내용을 변경하면 되는 것이다(위에서 보인 전략패턴을 사용하지 않은 코드는 해당 행위에 대한 클래스가 따로 존재하지 않고 따라서 그에 관한 코드를 변경할라치면 뭔가 복잡함을 지금도 느낌). 그리고 만약 새 검색방식이 추가 되면 그 검색방식에 해당하는 클래스를 SearchStrategy...라는 이름으로 만들어 주면 된다. 

이처럼 옵션들마다의 행동을 모듈화하여 인터페이스를 활용하여 독립적이고 상호 교체 가능하도록 만든 것이 Strategy, 전략 패턴입니다. 
(즉, 쉽게 말해 각각의 옵션을 클래스화하여 모듈화한것임(여기서 모듈화=클래스화). 그리하여 독립적이고 상호 교체 가능하도록 만든 것이 전략패턴임. 여기서 하나의 틀에 여러가지 클래스가 온다는 것이 상호 교체 가능하다는 말과 같다. 이 상호 교체 가능하게 해주는 것이 인터페이스이다. 즉, 인터페이스가 틀이다. 그 틀안을 다양한 클래스의 객체가 채우는 것이다. 좀 더 노골적으로 설명하면 MyProgram클래스의 setModeIamge라는 메서드만 호출하면 자동으로 객체가 생성되고 그 객체가 껍데기,틀인 인터페이스를 채우게 되는 것이다)

 

알맹이(객체)가 껍데기(인터페이스)를 교체하면서 채우는 바로 그 코드. MyProgram클래스에는 SearchButton객체를 가지고 있고 그 안에 아래와 같은 SearchStrategy인터페이스 참조변수가 있어 MyProgram객체를 하나생성해주면 인터페이스 참조변수 하나를 갖게 된다.

 

.

'객체지향 디자인 패턴' 카테고리의 다른 글

[UML] 클래스 다이어그램 (Class Diagram)  (0) 2023.11.04
생성패턴  (0) 2023.10.15
3. 장식(Decorator)패턴  (0) 2023.10.05
디자인 패턴(Design Pattern)이란?  (0) 2023.10.05
1. Singleton pattern  (0) 2023.09.04