최근에 계획한 것처럼 디자인패턴 공부의 필요성을 느껴 책을 다시 펼쳤다. 앞으로 스프링 공부를 시작하기 전까지 자바의 정석Head First Design Patterns 책을 병행해서 공부할 예정이다.

Strategy Pattern

디자인 원칙

  • 애플리케이션에서 달라지는 부분을 찾아 캡슐화한다.
    • 이로써 바뀌지 않는 부분에는 영향을 미치지 않은 채 그 부분만 따로 고치거나 확장할 수 있다.
  • 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.
    • Duck 클래스를 예로 들면 자주 바뀌는 행동 을 인터페이스로 표현하고 행동을 구현할 때 이러한 인터페이스를 구현하도록 했다.
    • 이렇게 하면 더이상 Duck 클래스에서 행동을 구체적으로 구현하는 방법에 대해 알 필요가 없다.
  • 상속보다는 구성을 활용한다.
    • 구성을 이용하면 유연한 시스템을 만들 수 있다.

패턴 정의

strategy pattern에서는 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 고로 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다. 다시 말해 여러 알고리즘을 하나의 추상적인 접근점을 만들어 서로 교환 가능하게 하는 디자인패턴이다.

예시

신작 게임에서 무기를 구현한다. 무기는 두 종류로 칼과 검이 있다.

public interface Weapon {
    public void attack();
}

public class Knife implements Weapon {
    public attack() { System.out.println("knife attack"); }
}

public class Sword implements Weapon {
    public attack() { System.out.println("sword attack"); }
}

public class Character {
    // 접근점 (interface)
    private Weapon weapon; 
    // setWeapon()을 통해 알고리즘 변경 가능
    public setWeapon(Weapon weapon) { this.weapon = weapon; }
    // delegate. 어떤 무기로 공격할 지는 알 필요가 없다.
    public attack() { weapon.attack(); } 
}

public class Execution {
    public static void main(String[] args) {
        Character character = new Character();

        character.setWeapon(new Knife());
        character.attack();
        character.setWeapon(new Sword());
        character.attack();
    }
}

참고