본 포스팅의 내용은 아래의 인프런 강의를 참조하여 작성되었습니다
(www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4/dashboard)
- Strategy Pattern (전략 패턴)
* 정의
: 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여, 객체의 행위를 동적으로 바꾸고 싶은 경우, 직접행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장시키는 방법.
즉, 서로 다른 객체가 할 수 있는 행위를 '전략' 이라는 단위로 만들어서, 행위의 수정이 필요할때, 전략만 바꿔서 행위를 수정하는 방식을 전략 패턴 (Strategy Pattern) 이라 부른다.
* 사전지식
전략 패턴을 학습하기에 앞서서 다음의 두가지 사항에 대한 사전 지식이 있어야한다.
1) Interface
2) Delegation
* Interface
: 자바에서 인터페이스란 어떤 기능에 대해서 선언과 구현부를 분리해 놓는 기능을 말하며, 다른 클래스에서 해당 기능을 사용하기 위한 통로로 활용되는것을 의미한다.
예를들면 아래와 같다
- AInterface.java
// 선언
public interface AInterface {
void funcA();
}
|
cs |
- AInterfaceImpl.java
// 구현
public class AInterfaceImpl {
@Override
public void funcA() {
System.out.println("Function A's Implementation");
}
}
|
cs |
- Main.java
public class Main {
// 구현과 선언을 따로 함과 동시에 기능을 실행하기 위한 통로 역할을 수행
public static void main(String[] args) {
AInterface aInterface = new AInterfaceImpl();
aInterface.funcA();
}
}
|
cs |
* Delegation
위임(Delegation) 이란 어떤 기능에 대해서, 책임소재를 다른 클래스로 떠넘기는 것을 말한다.
아래의 예제에서는, print() 함수의 기능에 대한 책임소재가 AObj 에게 부여하는게 아닌, BObj 에게 전적으로 위임한것을 볼 수 있다.
- BObj.java
public interface BObj {
void print();
}
|
cs |
- BObjImpl.java
public class BObjImpl implements BObj {
@Override
public void print() {
System.out.println("This is B Object");
}
}
|
cs |
- AObj.java
public class AObj {
// print 함수에 대한 책임소재를 BObj 에게 위임한 형태.
private BObj bObj;
public AObj() {
bObj = new BObjImpl();
}
public void callBObj() {
bObj.print();
System.out.println("This is A Object");
}
}
|
cs |
- Main.java
public class Main {
public static void main(String[] args) {
AObj aObj = new AObj();
aObj.callBObj();
}
}
|
cs |
이제 Interface 와 Delegation 에 대한 개념을 이해했으니, Strategy Pattern 의 예제를 살펴보자
예를들어서 다음과 같은 요구사항을 프로그래밍 하라고 명령받았다고 해보자
게임 캐릭터와 무기를 구현해달라는 요구를 받았다.
그리고 각 캐릭터가 무기를 가질 수 있게 프로그래밍 해달라는 요청이 왔다.
이때는, 캐릭터 클래스안에 일일이 무기를 구현하기 보다는, 캐릭터가 여러가지 무기들 중 하나를 선택 하게 만드는것이 더 유지 보수가 쉬울 것이다.
즉, 여러개의 무기들 중에서 캐릭터가 자신이 원하는 특정한 무기를 선택하는것은, 자신의 상황에 맞는 어떤 전략을 선택한것으로 볼 수 있다.
이런것처럼, 클라이언트가 특정한 전략을 선택하도록 만드는 설계 방식을 전략 패턴이라 부른다
아래는 이에 대한 코드 예제 이다.
- Weapon.java
public interface Weapon {
void attack();
}
|
cs |
- Sword.java
public class Sword implements Weapon{
@Override
public void attack() {
System.out.println("Attack with a sword");
}
}
|
cs |
- Bow.java
public class Bow implements Weapon {
@Override
public void attack() {
System.out.println("Attack with a bow");
}
}
|
cs |
- Axe.java
public class Axe implements Weapon {
@Override
public void attack() {
System.out.println("Attack with a Axe");
}
}
|
cs |
- Character.java
public class Character {
// 인터페이스를 통한 접근점(통로) 부여
private Weapon weapon;
public Character() {
this.weapon = null;
}
// 캐릭터가 여러개의 무기중 하나의 전략을 선택하도록 부여
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
public void useWeapon() {
if (weapon == null) {
System.out.println("Attack with a hand");
} else {
weapon.attack();
}
}
}
|
cs |
- Main.java
public class Main {
public static void main(String[] args) {
Character character = new Character();
character.useWeapon();
character.setWeapon(new Axe());
character.useWeapon();
character.setWeapon(new Sword());
character.useWeapon();
character.setWeapon(new Bow());
character.useWeapon();
}
}
|
cs |
이 예제를 보면 캐릭터 클래스가 도끼와 검 그리고 활 중에서 무기를 선택 할 수 있게 해줬다.
즉, 캐릭터가 직접 전략을 선택하여 코드를 구성한것이다.
이런 디자인 패턴을 전략 패턴이라 부른다.
아래는 이 코드에 대한 다이어그램이다.
전체 코드 : github.com/khusw/Design-Pattern/tree/master/Strategy-Pattern
'Java > 디자인패턴' 카테고리의 다른 글
Design Pattern - Adapter Pattern (0) | 2021.02.25 |
---|---|
Design Pattern - Overview (0) | 2021.02.23 |