스트래티지 패턴
행위(알고리즘)를 클래스로 캡슐화해서 동적으로 행위를 자유롭게 바꿀 수 있게 해주는 패턴
Example)
태권브이와 아톰이 로봇 클래스를 상속하는 상황
문제점:
1) 태권브이나 아톰의 공격(attack) 또는 이동 방법(move)을 수정하려면 기존 코드를 수정해야 한다.
2) 새로운 로봇을 만들어 attack, move 메소드를 가지게 하면 다른 클래스와 메소드가 중복된다.
중복이 왜 문제인가?
: 만약 태권브이와 선가드라는 로봇이 attack을 하면 미사일 공격을 하고, move를 하면 걷는다고 가정하자.
근데 클라이언트가 태권브이와 선가드의 attack은 펀치 공격을 하고, move는 비행을 하도록 변경한다고 해보자.
클라이언트 입장에서는 각 로봇마다 attack와 move 메소드를 빠짐없이 수정해야 한다.
만약 로봇이 더 늘어난다면 이 과정은 결코 쉽지 않다.
해결 방법: 변화하는 것을 캡슐화하자!
-> attack이 미사일 공격에서 펀치 공격으로 변했다면, attack을 인터페이스로 만들고 미사일 공격과 펀치 공격을 클래스로 만들어서 인터페이스를 구현하도록 하면 된다!
-> move가 걷기에서 비행으로 변했다면, move를 인터페이스로 만들고 걷기와 비행을 클래스로 만들어서 인터페이스를 구현하도록 하면 된다!
코드
class Robot{ private String name; private MovingStrategy movingStrategy; private AttackStrategy attackStrategy; public Robot(String name) { this.name=name; } public void move() { System.out.print(name+":"); movingStrategy.move(); } public void attack() { System.out.print(name+":"); attackStrategy.attack(); } public void setMovingStrategy(MovingStrategy movingStrategy) { this.movingStrategy=movingStrategy; } public void setAttackStrategy(AttackStrategy attackStrategy) { this.attackStrategy=attackStrategy; } } interface MovingStrategy{ public void move(); } interface AttackStrategy{ public void attack(); } class PunchStrategy implements AttackStrategy{ public void attack() { System.out.println("펀치 공격!"); } } class MissileStrategy implements AttackStrategy{ public void attack() { System.out.println("미사일 공격!"); } } class WalkingStrategy implements MovingStrategy{ public void move() { System.out.println("걷기!"); } } class FlyingStrategy implements MovingStrategy{ public void move() { System.out.println("비행!"); } } public class test{ public static void main(String[] args) { Robot robot1=new Robot("태권브이"); Robot robot2=new Robot("아톰"); robot1.setMovingStrategy(new WalkingStrategy()); robot1.setAttackStrategy(new PunchStrategy()); robot2.setMovingStrategy(new FlyingStrategy()); robot2.setAttackStrategy(new MissileStrategy()); robot1.move(); robot1.attack(); robot2.move(); robot2.attack(); } }