< Dev-Kidult />

디자인 패턴 - 전략패턴(Strategy pattern) 본문

개발/Back-end

디자인 패턴 - 전략패턴(Strategy pattern)

개른이 2019. 6. 29. 21:42

전략패턴(strategy pattern)은 위키에서 이렇게 설명하고 있습니다.

 

  • 특정한 계열의 알고리즘들을 정의하고

  • 각 알고리즘을 캡슐화하며

  • 이 알고리즘들을 해당 계열 안에서 상호 교체가 가능하게 만든다.

 

동물의 다리를 예로 진행을 해보겠습니다

 

동물이라면 어떤 동물은 다리가 2개, 4개 혹은 다리가 없는 경우도 있습니다.

 

전략패턴을 모른다면 우리는 이렇게 구현을 할 것입니다.

public interface Animal {
    void reg();
}

public class Tiger implements Animal{
    @Override
    public void reg() {
        System.out.println("난 다리가 4개야");
    }
}

public class Bird implements Animal{
    @Override
    public void reg() {
        System.out.println("난 다리가 2개야");
    }
}

 

 

하지만 나중에 저 호랑이가 다리를 다쳐서 다리가 3개가 된다거나, 유전적 변이가 일어나서 다리가 6개가 된다거나 하면

 

우리는 저 타이거 클래스에 들어가서 내부 소스를 수정을 해야 할 것입니다.

 

전략패턴은 교환 가능한 행동을 캡슐화하고 위임을 통해서 어떤 행동을 사용할지 결정한다고 되어있습니다.

 

 

저 변하는 다리 부분을 캡슐화를 통해 전략화 시킵니다.

public interface Reg {
    void reg();
}

public class TwoReg implements Reg{
    @Override
    public void reg() {
        System.out.println("난 다리가 2개야");
    }
}

public class ThreeReg implements Reg {
    @Override
    public void reg() {
        System.out.println("난 다리가 3개야");
    }
}

public class FourReg implements Reg {
    @Override
    public void reg() {
        System.out.println("난 다리가 4개야");
    }
}

 

그리고 기존 코드도 맞게 변경을 합니다.

public abstract class Animal {
    private Reg reg;

    public Animal(Reg reg) {
        this.reg = reg;
    }
}

public class Tiger extends Animal{
    public Tiger(Reg reg) {
        super(reg);
    }
}

 

그리고 생성자를 통해 호랑이를 만들 때 다리를 선택해주면 됩니다.

public class Main {
    Animal tiger = new Tiger(new FourReg());
    Animal threeRegTiger = new Tiger(new ThreeReg());
}

 

기존에는 호랑이가 다리 숫자가 변경되면 호랑이 클래스의 내부 소스를 변경하여야 됐지만,

지금은 여러 개의 다리 전략들 중 하나를 택하여 만들면 되도록 변경하였습니다.

 

나중에 추후 또 다리 개수가 변경이 일어나면 단지 전략을 바꿔주기만 하면 됩니다.

 

예제가 동물의 다리를 바꾸는 것으로 적절치는 않아 보이지만, 이러한 개념으로만 흘러간다라고 개념 정도만 이해해주시면 감사하겠습니다.

반응형
Comments