최근에 계획한 것처럼 디자인패턴 공부의 필요성을 느껴 책을 다시 펼쳤다. 앞으로 스프링 공부를 시작하기 전까지 자바의 정석 과 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();
}
}
참고
- Head First Design Patterns
- 자바 디자인패턴의 이해 - GoF Design Pattern