본문 바로가기

Define Java/Design&Patterns

Strategy Pattern #1

Strategy Pattern



스트래티지 패턴이란 각각의 기능을 하는 클래스를 캡슐화하여 이것을 교환하여 사용할 수 있도록 만드는 역활을 한다.
즉 현재 사용하고 있는 기능(클래스)를 동적으로 변경하여 적용 시킬 수 있다.

간단하게 예를 들자면 로봇 게임이 있다고 하자. (갑자기 http://www.defineyou.net/ 에서 본 로롯코드가 생각나서....)
이 로봇게임에는 여러가지 종류의 로봇이 나온다. 이 여러 종류의 로봇을 제작하기 위해서는 Robot 이라는 클래스를 상속 받아서 제작한다.

사용자 삽입 이미지
Robot Class에는 다음과 같은 기능이 있다.
 turn(); 돌고 도는 메소드
 move(); 이동을 하는 메소드
 attack(); 공격을 하는 메소드

각 로봇에는 display(); 라는 모양을 뿌려주는 메소드가 존재한다.

로봇게임 개발자는 로봇게임을 더 재밋게 발전 시키기 위해서 모든 로봇에 특수기술인 "날아다니는 기능"을 넣을려고 한다.
이 기능은 로봇이 하늘에서도 싸울 수 있는 기능을 하게 제작하여야한다.

당신이라면 이 문제를 어떻게 해결하겠는가?

사용자 삽입 이미지

쉽게 생각해 본다면 Robot이라는 상위클래스(슈퍼클래스)에 ability(); 라는 메소드를 만들어 날아다니는 기능을 구현하면 될것이다.
모든 로봇들은 Robot Class를 확장(상속)하여 사용하기 때문에 이렇게 한다면 아주 쉽게 해결 할 수가 있다.

로봇게임 개발자는 또 다시 생각을 해 보았다.
"태권V 로봇은 너무 강하니깐 하늘을 날아다니는 기능을 없애야 겠어"
자 모든 로봇들이 상속을 받은 Robot클레스에서는 ability();라는 메소드가 구현되어 있다.

어떤가? 이제 머리 아프게 생각을 해볼때가 됐다. Robot이라는 클래스를 상속 받기 때문에 Robot의 기능을 모두 가지고 있다.
당신이라면 이 문제를 어떻게 해결하겠는가?

ability(); 라는 메소드를 Overloading 하면 된다고 생각하는 사람도 많이 있을 것이다.
Overloading으로 이 문제 해결될 수 있지만 만약 이 프로그램이 발전되어 로봇의 종류가 100가지가 넘고 특수기능의 종류가 많아 졌다고 생각해보자!

개발자는 정말 안구에 습기차도록 노가다를 해야 될 것이다.

어떻게 하면 이 문제를 해결 할 수 있을까? 조금은 생각해 보는것이 좋을 꺼 같다.
다음차 블로그에 이 문제에 대한 해결책을 올리도록 하겠다.
그 안에 열심히 생각을 해 바란다.^ㅡ^