OOP/Design Pattern

[OOP] 스트래티지 패턴(Strategy Pattern)

IT록흐 2022. 11. 13. 21:43
반응형

 

 

디자인 패턴이란?

객체지향설계 과정에서 발생하는 문제들을 해결하기 위한 패턴(Pattern)

 

 

 

문제 상황

 

 

 

객체자향설계 중 '상속'은 한 가지 문제가 있다. 

 

로봇 클래스를 상속하는 Atom 클래스와 TakwonV 클래스가 있다. 만약 자식 클래스로 Ironman 클래스가 추가 된다면 어떻게 될까?

 

 

 

 

Ironman 클래스는 부모클래스의 메소드를 Override 한다. 문제는 TakwonV와  Ironman 클래스의 attack() 메소드가 소스 중복이 생기고 Atom클래스와 Ironman 클래스 사이에 move() 메소드에 소스 중복이 생긴다. 이처럼 자식클래스는 부모클래스의 메소드를 Override하면서 소스 중복이 생기고 이로인해, 유지보수가 힘들어 진다. 

 

이와같은 상속의 문제를 해결하기 위해 등장한 디자인 패턴이 바로, 스트래티지 패턴(Strategy Pattern)이다. 

 

 

 

해결책

 

 

 

 

공격과 이동 전략을 인터페이스로 분리한다.

 

 

 

 

 Robot 클래스 내부에 메소드로 attack과 move 전략이 알고리즘으로 박혀일을 때와는 달리, Robot클래스와 Strategy 인터페이스는 setter 함수로 연결한다. 이로써 언제든 Robot 클래스의 수정없이 Attack과 Move 전략을 바꾸어 줄 수 있다. 

 

 

코드

 

Robot 클래스

// 로봇 클래스 ( 부모 클래스 )
public class Robot {

private String name;
private AttackStrategy attackStrategy;
private MoveStrategy moveStrategy;

public Robot(String name) {
	this.name = name;
}

public void setAttackStrategy(AttackStrategy attackStrategy) {
	this.attackStrategy = attackStrategy;
}

public void setMoveStrategy(MoveStategy moveStrategy) {
	this.moveStrategy = moveStrategy;
}

public void attack() {
	attackStrategy.attack();
}

public void move() {
	moveStrategy.move();
}
}

 

자식 클래스

// 자식클래스 1
public class Atom extends Robot {
public Atom(String name) {
	super(name)
}
}

// 자식클래스 2
public class TaekwonV extends Robot {
public TaekwonV(String name) {
	super(name)
}
}

// 자식클래스 3
public class IronMan extends Robot {
public IronMan(String name) {
	super(name)
}
}

 

Main 클래스 

public class Main() {
	public static void main(String[] args) {

        Robot ironman = new Ironman("Ironman");

        ironman.setAttackStrategy(new Missile()); 
        ironman.setMoveStrategy(new Fly());

        ironman.move();
        ironman.attack();
	}
}

 

 

정리

장점 1)

아이언맨의 공격전략이 바뀔 시, 다른 구현객체를 setter함수에 넣어주면 된다.

 

장점 2)

미사일 사거리 증가 시, 미사일 클래스 로직만 변경하면 미사일을 사용하는 모든 로봇객체에 적용된다.

 

장점 3)

새로운 로봇이 추가되어도, 다양한 공격, 이동 전략을 사용할 수 있다.

 

 

 


 

 

참고자료

 

JAVA 객체지향 디자인 패턴 : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

 

 

 

 

 

반응형