티스토리 뷰

728x90
반응형

전략 패턴이란?


  • 변하지 않는 기능을 Context라는 곳에 두고, 변하는 부분을 Strategy라는 인터페이스를 만들고 해당 인터페이스를 구현하도록하여 문제를 해결하는 방식입니다. 상속이 아닌 위임을 통하여 문제를 해결합니다.

 

클래스 다이어그램


 

전략 패턴 구조


 

상황 설명


  • 교수와 학생은 휴대폰의 잠금을 해지하는 경우 교수는 안면 인식을 통하여 잠금을 해제하고 학생은 비밀번호를 입력하여 잠금을 해제합니다. 여기서 잠금을 해제하는 행위는 변하지 않는 행위이며 휴대폰의 잠금을 해지하기 위한 과정의 행위는 변하는 행위입니다.
  • 안면인식과 비밀번호 입력은 사용자마다 변하는 행위이므로 Straegy에 비유할 수 있고 잠금 해제하는 행위는 변하지 않는 행위이므로 Context에 비유할 수 있습니다.

 

전략 패턴을 적용하지 않은 예제


  • 아래 예제를 보면 Teacher 클래스와 Student 클래스에서 휴대폰의 화면을 키는 행위는 동일하고 암호를 해지하는 방법에서의 행위만 달라집니다.
public class Teacher {

    public void passwordRelease() {
        System.out.println("휴대폰의 화면을 킵니다.");
        System.out.println("안면 인식 방법으로 암호를 해지합니다.");
    }
}

public class Student {

    public void passwordRelease() {
        System.out.println("휴대폰의 화면을 킵니다.");
        System.out.println("비밀번호 방법으로 암호를 해지합니다.");
    }
}

public class Example {

    @Test
    void test(){
        Teacher teacher = new Teacher();
        teacher.passwordRelease();

        Student student = new Student();
        student.passwordRelease();
    }
}

 

Example 실행 결과

 

 

전략 패턴을 적용한 예제 - 01


  • 아래 예제는 변하는 행위를 하는 메서드를 Strategy 인터페이스에 선언한 뒤 해당 메서드를 각 클래스마다 구현을 하도록하여 다형성을 부여합니다.
  • 화면을 키는 행위는 변하지 않는 행위이므로 Human이라는 클래스를 만들어 공통화를 합니다.
  • Human 클래스는 Context에 해당합니다.
public interface Strategy {

    void passwordRelease();
}

public class Teacher implements Strategy{

    @Override
    public void passwordRelease() {
        System.out.println("안면 인식 방법으로 암호를 해지합니다.");
    }
}

public class Student implements Strategy{

    @Override
    public void passwordRelease() {
        System.out.println("비밀번호 방법으로 암호를 해지합니다.");
    }
}

public class Human {

    private Strategy strategy;

    public Human(Strategy strategy) {
        this.strategy = strategy;
    }

    public void execute(){
        System.out.println("휴대폰의 화면을 킵니다.");
        strategy.passwordRelease();
    }
}

public class Example {

    @Test
    void test(){
       Strategy teacherMethod = new Teacher();
       Strategy studentMethod = new Student();

       Human teacher = new Human(teacherMethod);
       Human student = new Human(studentMethod);

       teacher.execute();
       student.execute();
    }
}

 

Example 실행 결과

 

전략 패턴을 적용한 예제 - 02


  • 위의 예제와 동일하지만 위의 예제는 멤버 변수에 생성자 주입을 통하여 진행을 했지만 해당 예제는 전략을 실행할 때 파라미터로 전달하여 사용하는 예제입니다.
  • Human 클래스와 실행 예제만 달라집니다.
  • Human 클래스의 execute() 메서드에서 Strategy 인터페이스를 구현하는 구현체를 파라미터로 받아서 Context를 실행하는 시점에서 원하는 Strategy를 전달할 수 있습니다.
  • 이전방식과 비교해본다면 생성시점에서 받는것보다 실행시점에서 받는것이 조금 더 유연성이 있는것 같습니다.
public class Human {

    public void execute(Strategy strategy){
        System.out.println("휴대폰의 화면을 킵니다.");
        strategy.passwordRelease();
    }
}

public class Example {

    @Test
    void test(){
        Human human = new Human();
        human.execute(new Teacher());
        human.execute(new Student());
    }
}

 

Example 실행 결과

 

728x90
반응형