strategy pattern(스트래티지 패턴)
알고리즘군을 정의하고 각각을 캡슐화하여 교환하여 사용할수 있도록 만들어
기존 클래스와는 독립적으로 알고리즘 변경이 가능하다.
예제 코드>
1. Car 클래스
속성 : speed - double(차량의 속도를 저장할 변수), gear - int(기어값을 저장할 변수)
기능 : onAccel(), onBreak(), changeGear()
onAccel() : 차량 속도를 올리는 메서드
onBreak() : 차량 속도를 줄이는 메서드
changeGear() : 기어 변경 메서드
- Car.java
package com.strategy.test;
public class Car {
private static final int MAX_SPEED = 250;
private double speed;
private int gear;
public Car() {
super();
// TODO Auto-generated constructor stub
}
public double getSpeed() {
return speed;
}
public int getGear() {
return gear;
}
public void onAccel(){
speed += 10;
if(speed > MAX_SPEED)
speed = MAX_SPEED;
}
public void onBreak(){
speed -= 20;
if(speed < 0)
speed = 0;
}
public void onStatus(){
System.out.println("현재 속도 : "+speed);
}
public void changeGear(int gear){
/**
* 기어값 리스트
* -1 - 후진기어
* 0 - 중립기어
* 1 - 1단
* 2 - 2단
* 3 - 3단
* 4 - 4단
* 5 - 5단
*/
if(gear >= -1 && gear < 6)
this.gear = gear;
}
}
초기 Car 클래스에는 기본적인 구동에 관련된 클래스만 디자인 하였다.
하지만 추후 부스터 기능을 추가 및 변경 한다고 했을때 클래스의 구조를 매번 뜯어 고쳐야되는 상황이 발생하였다.
부스터에 관련된 기능을 따로 인터페이스를 이용하여 기능에 관련된 기능을 분리하여 부스터 관련 기능이 바뀌어도 기존의 Car클래스에 영향을 미치지 않고 바꿀수 있도록 디자인을 변경하겠음
2. Boost 인터페이스
부스터를 구현하는 클래스들이 기본적으로 implements할 인터페이스
기능 : onBoost()
3. SingleBoost - Boost
기능 : onBoost()
onBoost() : 부스터 기능 실행하는 메서드
4. 변경된 Car 클래스
속성 : speed - double(차량의 속도를 저장할 변수), gear - int(기어값을 저장할 변수)
boost - Boost(부스터 기능을 저장할 변수)
기능 : onAccel(), onBreak(), changeGear(), onBoost()
onAccel() : 차량 속도를 올리는 메서드
onBreak() : 차량 속도를 줄이는 메서드
changeGear() : 기어 변경 메서드
onBoost() : boost에 있는 부스터 기능 호출하는 메서드
package com.strategy.test;
public class Car {
private static final int MAX_SPEED = 250;
private double speed;
private int gear;
private Boost boost;
public Car() {
super();
// TODO Auto-generated constructor stub
}
public double getSpeed() {
return speed;
}
public int getGear() {
return gear;
}
public Boost getBoost() {
return boost;
}
public void setBoost(Boost boost) {
this.boost = boost;
}
public void onBoost(){
if(boost != null)
boost.onBoost();
else
System.out.println("현재 차량은 부스터 기능이 없습니다.");
}
public void onAccel(){
speed += 10;
if(speed > MAX_SPEED)
speed = MAX_SPEED;
}
public void onBreak(){
speed -= 20;
if(speed < 0)
speed = 0;
}
public void onStatus(){
System.out.println("현재 속도 : "+speed);
}
public void changeGear(int gear){
/**
* 기어값 리스트
* -1 - 후진기어
* 0 - 중립기어
* 1 - 1단
* 2 - 2단
* 3 - 3단
* 4 - 4단
* 5 - 5단
*/
if(gear >= -1 && gear < 6)
this.gear = gear;
}
}
5. TestCar.java - 위 예제 테스트용 메인 클래스
package com.strategy.test;
public class TestCar {
public static void main(String[] args) {
// TODO Auto-generated method stub
Car car = new Car();
/**
* setBoost 메서드를 이용하여 여러 종류의 부스터 객체를 탈부착 가능하다.
*/
car.setBoost(new SingleBoost());
car.onBoost();
}
}