게임에서 무기를 바꿀때,
카테고리를 선택하고 그에 맞는 검색을 하고 싶을 때,
쿠폰의 종류가 많고 때에따라, 조건에 따라 할인률이 다를 때
자바에서... 어디서 많이 봤다 했는데 sort할 때 쓰는 방법이 전략패턴이군
Strategy (recognizeable by behavioral methods in an abstract/interface type which invokes a method in an implementation of a different abstract/interface type which has been passed-in as method argument into the strategy implementation)
java.util.Comparator#compare()
, executed by among others Collections#sort()
.javax.servlet.http.HttpServlet
, the service()
and all doXXX()
methods take HttpServletRequest
and HttpServletResponse
and the implementor has to process them (and not to get hold of them as instance variables!).javax.servlet.Filter#doFilter()
쿠폰의 종류를 경우에 따라 바꿀때
전략패턴 사용 시
검색 카테고리를 바꿀 때
전략패턴 적용 안할 시
전략패턴 적용시
무기를 가지고 예시를 든게 가장 깔끔하기 때문에 이야기's G의 예시를 차용해서 코드를 살펴보자.
공격
이라는 기능을 수행한다.// 이 예시는 전략패턴을 사용하지 않고 그냥 짯을 경우의 코드이다. 어디가 문제일까?
class Character{
Weapon weapon = new Weapon("");
public void attack() {
weapon.attack();
}
public void setWeapon(String weapon) {
this.weapon.setType(weapon);
}
}
class Weapon{
String type;
public Weapon(String type) {
this.type = type;
}
public void setType(String type) {
this.type = type;
}
public void attack() {
if (this.type == "") {
System.out.println("맨손 공격");
} else {
System.out.println(type + " 공격");
}
}
}
public class Game {
public static void main(String[] args) {
Character jungHwan = new Character();
// 길을 걷가가 몬스터를 만나서 공격을 합니다.
jungHwan.attack();
// 검을 줏었습니다.
jungHwan.setWeapon("sword");
// 길을 걷가가 몬스터를 만나서 공격을 합니다.
jungHwan.attack();
// 칼을 줏었습니다.
jungHwan.setWeapon("knife");
// 길을 걷가가 몬스터를 만나서 공격을 합니다.
jungHwan.attack();
// 추가부분 도끼를 추가할 경우, 따로 처리할 것이 없다.....만? 이 도끼라는 객체가 없으므로 도끼를 이용한 어떠한 추가 작업도 못하겠지... 오직 도끼라는 정보 하나만 필요할때나 이렇게 설계하겠지.
jungHwan.setWeapon("ax");
// 길을 걷가가 몬스터를 만나서 공격을 합니다.
jungHwan.attack();
}
}
// 전략패턴으로 디자인한 코드
// 추상화
interface Weapon{
public void attack();
}
class Sword implements Weapon {
@Override
public void attack() {
System.out.println("검 공격!");
}
}
class Knife implements Weapon {
@Override
public void attack() {
System.out.println("칼 공격!");
}
}
// 2. 도끼 클래스 생성
class Ax implements Weapon {
@Override
public void attack() {
System.out.println("도끼 공격!");
}
}
class 지팡이 implements Weapon {
@Override
public void attack() {
System.out.println("지팡이 공격!");
}
}
// 2-1. 무기라는 인터페이스로 소통하기 때문에, 무기를 사용하는 캐릭터 클래스의 경우 변화가 없다.
class Character{
// 위임
Weapon weapon;
public void attack() {
if (weapon == null) {
System.out.println("맨손 공격");
} else {
weapon.attack();
}
}
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
}
public class Game {
public static void main(String[] args) {
Character jungHwan = new Character();
// 길을 걷가가 몬스터를 만나서 공격을 합니다.
jungHwan.attack();
// 검을 줏었습니다.
jungHwan.setWeapon(new Sword());
// 길을 걷가가 몬스터를 만나서 공격을 합니다.
jungHwan.attack();
// 칼을 줏었습니다.
jungHwan.setWeapon(new Knife());
// 길을 걷가가 몬스터를 만나서 공격을 합니다.
jungHwan.attack();
// 1. 도끼라는 객체를 추가하기 위해 무기 인터페이스를 상속해서 도끼 클래스를 만들자.
// 3. 도끼를 줏었습니다.
jungHwan.setWeapon(new Ax());
// 길을 걷가가 몬스터를 만나서 공격을 합니다.
jungHwan.attack();
}
}