디자인 패턴 – 스트래티지 패턴

스트래티지 패턴
행위(알고리즘)를 클래스로 캡슐화해서 동적으로 행위를 자유롭게 바꿀 수 있게 해주는 패턴

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();
	}
}

Leave a Reply

Your email address will not be published. Required fields are marked *