개발에서 중요하지 않은 분야가 뭐가 있겠냐 싶겠냐만은 나의 짧은 개발경험과 지식으로는 전체적인 소프트웨어 설계능력이 결국 모든 개발 프로세스의 알파이자 오메가라고 생각한다.
따라서 다자인패턴 분야의 필독서인 GoF의 디자인패턴을 참고하여 디자인패턴에 관한 내용을 포스팅하려고 한다. 여러 디자인 패턴이 있지만 실무에서 가장 많이 쓰이는 전략패턴부터 알아보고자 한다. 모든 디자인패턴을 포스팅 하는것을 목표로 한다. 출발
동일한 계열의 알고리즘군을 정의하고 각 알고리즘군을 캡슐화하여 클라이언트와 상관없이 독립적으로 알고리즘을 목적에 맞게 변경할 수 있게 하는 패턴.
Strategy(Compositor) : 제공하는 모든 알고리즘에 대한 공통의 연산들을 인터페이스화, Context는 인터페이스화된 Strategy를 통해서 구체화된 실제 알고리즘을 사용한다.
ImplA,ImplB : Strategy 인터페이스의 공통으로 묶어놓은 알고리즘을 실제로 구현한다.
Context : Strategy에 있는 참조자(ImplA,ImplB)를 관리한다. 즉, Strategy의 서브클래스 인스턴스를 가지고 있음으로써 구체화한다.
Client는 필요하다고 판단되는 알고리즘을 선정하여 Context에게 요청한다. Context 클래스와 Strategy 클래스는 의사교환을 통해 선택한 알고리즘을 구현한다. Context는 연산에 필요한 데이터를 Strategy 클래스에 넘겨준다. 실제로 구현된 Impl 클래스는 Context와 함께 동작한다.
Strategy(Developer)
// Strategy public interface Developer { void runStrategy(); }
Context(Person)
public class Person { void doCoding(Developer developer){ System.out.print("HI! "); developer.runStrategy(); // 전략 적용 } }
Impl(JavaDeveloper,CDeveloper) a.k.a ConcreteClass
public class JavaDeveloper implements Developer { @Override public void runStrategy() { // behavior System.out.println("Now, I am Java Developer"); } }
public class CDeveloper implements Developer { @Override public void runStrategy() { // behavior System.out.println("I am C Developer"); } }
Client
public class Client { public static void main(String[] args){ Developer developer; Person person = new Person(); developer = new CDeveloper(); person.doCoding(developer); developer = new JavaDeveloper(); person.doCoding(developer); } }
코드 실행 결과
Hi! I am C Developer
Hi! Now, I am Java Developer
Context로 Person 을 구성하여 전략을 적용한 구체클래스의 알고리즘을 호출했다. Strategy 인터페이스를 구현한 CDeveloper,JavaDeveloper는 클라이언트에서 요청함에 따라 생성되어 각 알고리즘을 수행한다.
참고 : GoF의 디자인패턴