Java 디자인패턴 - 전략(Strategy) 패턴
오늘부터 Java 디자인 패턴을 예제와 함께 설명하는 포스팅을 하려고 합니다. 그 중에서 첫 번 째로 실무
프로젝트에서 가장 많이 사용하고 중요한 전략패턴을 설명하려고 합니다.
전략패턴은 각각의 알고리즘군을 교환이 가능하도록 별도로 정의하고 각각 캡슐화 한 후 서로 교환해서 사용
할 수 있는 패턴이며, 아래와 같은 장점이 있습니다.
- 코드 중복 방지
- 런타임(Runtime)시에 타겟 메소드 변경
- 확장성(신규 클래스) 및 알고리즘 변경 용이
즉, "프로젝트 전체에서 변경이 일어나지 않는 부분에서 변경이 일어나는 부분을 찾아서 따로 캡슐화 한다."
라고 이해하시면 쉬울 듯 싶습니다.
아래 설명을 읽어보시고 예제 소스코드를 학습하시면 쉽게 이해하실 수 있을 거라 생각합니다.
Java 관련 포스팅 : Java 관련
Java 관련 포스팅 : Java 관련
Java 전략(Strategy) Pattern - 구조 설명
아래와 다이어그램으로 나타낼 수 있으며, 세부 항목은 하단에서 설명합니다.
전략패턴 구조(Structure)
- Strategy(전략) : 전략 사용을 위한 인터페이스 생성
- ImplementationOne, ImplementationTwo : Strategy 인터페이스를 구현한 실제 알고리즘을 구현
- Context : 인스턴스를 주입받아 직접 사용하는 역할
Java 전략(Strategy) Pattern - 예제 소스 코드
위에 전략패턴을 적용한 4개의 파일로 구성되어 있는 자동차 행동을 직진, 후진, 좌회전, 우회전
표현하는
예제 소스 코드 입니다. 어렵지 않은 내용이니 차근차근 소스코드를 분석해 보시기 바랍니다.
CarMoveBehavior.java
1 2 3 4 5 | package strategy; public interface CarMoveBehavior { public void action(); } | cs |
CarBehavior.java
123456789101112131415161718192021222324 class UpBehavior implements CarMoveBehavior{ @Override public void action() { System.out.println("Up!"); } } class DownBehavior implements CarMoveBehavior{ @Override public void action(){ System.out.println("Down!"); } } class LeftBehavior implements CarMoveBehavior{ @Override public void action(){ System.out.println("Left!"); } } class RightBehavior implements CarMoveBehavior{ @Override public void action(){ System.out.println("Right!"); } } cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class UpBehavior implements CarMoveBehavior{ @Override public void action() { System.out.println("Up!"); } } class DownBehavior implements CarMoveBehavior{ @Override public void action(){ System.out.println("Down!"); } } class LeftBehavior implements CarMoveBehavior{ @Override public void action(){ System.out.println("Left!"); } } class RightBehavior implements CarMoveBehavior{ @Override public void action(){ System.out.println("Right!"); } } | cs |
Car.java
Car.java
12345678910111213141516 public class Car { private CarMoveBehavior carMoveBehavior; public Car(CarMoveBehavior carMoveBehavior) { this.carMoveBehavior = carMoveBehavior; } public void move(){ carMoveBehavior.action(); } public void setMoveBehavior(CarMoveBehavior carMoveBehavior) { this.carMoveBehavior = carMoveBehavior; }} cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class Car { private CarMoveBehavior carMoveBehavior; public Car(CarMoveBehavior carMoveBehavior) { this.carMoveBehavior = carMoveBehavior; } public void move(){ carMoveBehavior.action(); } public void setMoveBehavior(CarMoveBehavior carMoveBehavior) { this.carMoveBehavior = carMoveBehavior; } } | cs |
Main.java
Main.java
12345678910111213141516171819202122 public class Main { public static void main(String[] args) { System.out.println("=====Java Strategy Pattern====="); //Up Car car1 = new Car(new UpBehavior()); car1.move(); //Down Car car2 = new Car(new DownBehavior()); car2.move(); //Left car2.setMoveBehavior(new LeftBehavior()); car2.move(); //Right car2.setMoveBehavior(new RightBehavior()); car2.move(); }} cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class Main { public static void main(String[] args) { System.out.println("=====Java Strategy Pattern====="); //Up Car car1 = new Car(new UpBehavior()); car1.move(); //Down Car car2 = new Car(new DownBehavior()); car2.move(); //Left car2.setMoveBehavior(new LeftBehavior()); car2.move(); //Right car2.setMoveBehavior(new RightBehavior()); car2.move(); } } | cs |
Java Design Pattern 의 QuickGuide 및 추가 정보는 이 곳을 참고해 주세요.
Java Design Pattern 의 QuickGuide 및 추가 정보는 이 곳을 참고해 주세요.
Java 전략(Strategy) Pattern - 클래스 다이어그램(UML) 및 예제 실행
위의 예제는 아래와 같은 클래스 다이어그램으로 표현 가능합니다.
Class Diagram
소스 코드 작성 후 실행하시면 아래와 같이 동작하는 화면을 확인하실 수 있습니다.
실제 실행 화면
마무리
실제 개발에서 디자인패턴 사용의 중요성은 아무리 강조해도 지나치지 않은 것 같습니다. 숙력된 객체 지향적으로 만들어진 디자인패턴의 사용은 프로그램 설계를 더욱 유연하게 합니다.
또한, 변화에 쉽게 대응 가능하게 되면서 궁극적으로 유지보수를 편하게 할 수 있다는 장점이 있는 것 같습니다.
유지보수가 원활하다면, 소프트웨어 유지 비용 절감의 부가효과도 당연히 따라오는 것이라고 생각이 됩니다.
이어지는 포스팅에서는 다양한 자바 디자인패턴에 대해 설명하겠습니다. 감사합니다.
소스코드 다운로드 : strategy-pattern.zip
'언어 > Java' 카테고리의 다른 글
Java(자바) 디자인패턴 - 템플릿 메소드(Template Method) 패턴 설명 및 예제소스 (1) | 2018.05.18 |
---|---|
Java(자바) 디자인패턴 - 어댑터(Adapter) 패턴 설명 및 예제소스 (0) | 2018.05.15 |
Java(자바) Runtime - 외부 프로세스(exec) 실행 예제 소스 (3) | 2017.12.29 |
Java(자바) BlockingQueue - Producer 및 Consumer 패턴 예제 (0) | 2017.12.27 |
Java(자바) 알고리즘 - 문자열로 서로 다른 단어 만들어내기(Anagram) (2) | 2017.12.25 |