Strategy pattern이란 ?

▶ 같은 종류의 작업을 하는 알고리즘을 정의, 각 알고리즘을 캡슐화, 그리고 알고리즘들을 서로 바꿔 사용할 수 있도록 한다. 스트래티지 패턴은 알고리즘을 사용하는 클라이언트로부터 독립적으로 알고리즘을 바꿔서 적용시킬 수 있도록 합니다. 

 

정의만 본다면 무슨 뜻인지 잘 이해가 가지 않을 수 있습니다. 바로 코드와 클래스 다이어그램으로 알아보겠습니다. 

 

사람은 계산기를 사용하고 계산기의 종류는 총 2가지 입니다. 덧셈을 진행하는 계산기와 뺄셈을 진행하는 계산기입니다. strategy pattern을 적용한 형태입니다. operate()를 호출해서 calculator의 execute()를 실행합니다. 계산기의 역할에 따라 set을 이용해서 바꿔줍니다.

 

1. Calculator interface 

public interface Calculator {
    double execute(double n1, double n2);
}

2. PlusCalculator class 

public class PlusCalculator implements Calculator{
    @Override
    public double execute(double n1, double n2) {
        return n1+n2;
    }
}

3. class MinusCalculator

public class MinusCalculator implements Calculator{

    @Override
    public double execute(double n1, double n2) {
        return n1-n2;
    }
}

 

▶ PlusCalculator와 MinusCalculator은 Calculator를 상속받아 각자의 알고리즘을 구현합니다.

4. People class

public class People {

    private Calculator calculator;
    private double n1;
    private double n2;

    public double operate(){
        return calculator.execute(n1,n2);
    }

    public void setCalculator(Calculator calculator){
        this.calculator=calculator;
    }

    void changeNumber(double n1, double n2) {
        this.n1 = n1;
        this.n2 = n2;
    }

}

▶ setCalculator()을 이용해서 원하는 계산기로 바꿀 수 있습니다.

5. Main class

public class Main {
    public static void main(String[] args) {
        People people = new People();

        // 숫자 설정
        people.changeNumber(1,2);

        // Calculator 설정
        people.setCalculator(new PlusCalculator());
        double result1 = people.operate();
        System.out.println(result1);


        // 새로운 Calculator 설정
        people.setCalculator(new MinusCalculator());
        double result2 = people.operate();
        System.out.println(result2);
    }
}

▶실행 결과

정상적인 출력을 볼 수 있습니다.


함수를 오버라이딩하여 필요한 구현체를 사용하는 패턴입니다. 

 

인터페이스가 가지고 있는 함수가 1가지일 경우 람다로 표현할 수 있습니다. 

// 람다 PlusCalculator
people.setCalculator((n1,n2)->{
    return n1+n2;
});
double result3 = people.operate();
System.out.println(result3);

// 람다 MinusCalculator
people.setCalculator((n1,n2)->{
    return n1-n2;
});
double result4 = people.operate();
System.out.println(result4);

같은 결과가 나오는 것을 볼 수 있습니다. 

6. lamda 바꾼 main class 


public class Main {
    public static void main(String[] args) {
        People people = new People();

        // 숫자 설정
        people.changeNumber(1,2);

        // Calculator 설정
        people.setCalculator(new PlusCalculator());
        double result1 = people.operate();
        System.out.println(result1);


        // 새로운 Calculator 설정
        people.setCalculator(new MinusCalculator());
        double result2 = people.operate();
        System.out.println(result2);


        // 람다 PlusCalculator
        people.setCalculator((n1,n2)->{
            return n1+n2;
        });
        double result3 = people.operate();
        System.out.println(result3);

        // 람다 MinusCalculator
        people.setCalculator((n1,n2)->{
            return n1-n2;
        });
        double result4 = people.operate();
        System.out.println(result4);

    }
}

 


지금까지 strategy pattern(전략패턴)을 알아보았습니다. 다음은 옵저버 패턴을 포스팅하겠습니다. 감사합니다. 

 

 

전체 코드는 아래에서 확인 가능합니다:)

https://github.com/rlaehdals/design-pattern

 

GitHub - rlaehdals/design-pattern

Contribute to rlaehdals/design-pattern development by creating an account on GitHub.

github.com