-정의-
알고리즘(이하 로직)을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 스트래티지 패턴을 활용하면 로직을 사용하는 클라이언트와는 독립적으로 로직을 변경할 수 있다.
예시(해당 예시는 헤드퍼스트 디자인 패턴 책에 나온 예시이다)
무기를 인터페이스로 만든다
그 후 무기를 쓰는 구체적 행위를 구현 클래스에서 따로 정의한다
Character추상클래스에서는 각각의 직업이 상속받는다
기사는 검을 쓰지만 활을 쓸수도 있습니다
무기의 교체가 일어날 수 있기 때문에 모든 기사 클래스에서 모든 무기의 사용법을 구현하는 것은 비효율적입니다
이렇게 특정하게 변경을 해야 할 경우 단지 인터페이스의 구현 클래스를 새로 끼우는 방식으로 수정이 가능한 것이 이 패턴의 큰 장점입니다
예시 코드입니다
//먼저 캐릭터 추상클래스를 만듭니다
public abstract class Character {
WeaponBehavior weapon;
public abstract void fight();
//무기의 인터페이스구현클래스를 동적으로 교체하기위해 작성합니다
public void setWeapon(WeaponBehavior w){
this.weapon = w;
};
}
public class Knight extends Character{
@Override
public void fight() {
weapon.useWeapon();
}
}
//무기 인터페이스
public interface WeaponBehavior {
void useWeapon();
}
public class SwordBehavior implements WeaponBehavior{
@Override
public void useWeapon() {
System.out.println("검으로 찌르다");
}
}
public class bowBehavior implements WeaponBehavior {
@Override
public void useWeapon() {
System.out.println("활을 쏘다");
}
}
만약 기사가 검을 쓰다 활을 써야 할 경우를 가정해보겠습니다
실행 예시 코드입니다
public class Main {
public static void main(String[] args) {
Knight k = new Knight();
//기사가 검을 쓸때
System.out.println("검 사용");
k.setWeapon(new SwordBehavior());
k.fight();
//기사가 활을 쓸때
System.out.println("활 사용");
k.setWeapon(new bowBehavior());
k.fight();
}
}
검을 사용 시엔 무기 인터페이스 중 검을 구현하는 클래스를 넣습니다
활을 사용 시엔 무기 인터페이스 중 활을 구현하는 클래스를 넣습니다
실행 코드입니다
이처럼 변화가 되는 것을 인터페이스로 선언 후 구현 클래스를 작성합니다
메인클래스나 실행클래스에서는 인터페이스 선언 후 구현 클래스를 교체하여 사용하는 것이 핵심입니다
여담으로 처음 스프링을 배울 때 이 패턴을 몰라 왜 인터페이스로 선언 후 구현 클래스를 교체하는지 몰라서 헤맷던 기억이 있습니다 디자인 패턴을 알고 스프링에 들어 갓으면 훨씬 좋았겠다는 생각이 드네요
다음 포스팅은 옵서버 패턴입니다
참고서적 : Head First Design Patterns
꼭 사세요 두 번 사세요
책을 참고하였지만 직접내용을 치고 구현한 것이라 오류나 오탈자가 있을 수 있습니다.
틀린 내용 있을 시 덧글에 적어주시면 참고하여 수정하겠습니다 감사합니다.
'Programming > 디자인 패턴' 카테고리의 다른 글
싱글턴 패턴 (Singleton) (0) | 2021.02.04 |
---|---|
팩토리 메서드 패턴 (Factory Method), 추상 팩토리 패턴 (Abstract Factory) (0) | 2021.02.03 |
데코레이터 패턴 (Decorator) (0) | 2021.02.02 |
옵저버 패턴 (Observer) (0) | 2021.01.29 |
GOF 디자인 패턴 한줄 정리! (0) | 2021.01.21 |
댓글