본문 바로가기

Java

[Java]_JAVA로 디자인패턴 공부_Strategy Pattern

 

Strategy Pattern :

특정한 계열의 알고리즘들을 정의하고 각 알고리즘을 캡슐화하며 이 알고리즘들을 해당 계열 안에서 상호 교체가 가능하게 만든다.


최종 부모클래스는 Hero 입니다.

 

영웅의 직업은 마법사(Wizard), 전사(Warrior), 기사(Knight), 소서리스(Sorceress) 입니다.

 

공격(Attack) 기능을 구현하고 싶은데 직업마다 공격법이 달랐으면 합니다.

 

마법사 - fireMagicAttack

전사 -  punchAttack

기사 - swordAttack

소서리스 - iceMagicAttack

 

영웅들은 객체마을에서 단순히 attack()을 하면 각자 직업에 맞는 공격을 구현하고 싶습니다.


 

package org.example;

interface AttackBehavior{
void Attack();
}

class FireMagicAttack implements AttackBehavior{
@Override
public void Attack() {
System.out.println("fireMagicAttack!");
}
}

class PunchAttack implements AttackBehavior{
@Override
public void Attack() {
System.out.println("punchAttack!");
}
}

class SwordAttack implements AttackBehavior{
@Override
public void Attack() {
System.out.println("swordAttack!");
}
}

class IceMagicAttack implements AttackBehavior{
@Override
public void Attack() {
System.out.println("iceMagicAttack");
}
}



class Hero{
AttackBehavior attackBehavior;
}


class Wizard extends Hero implements AttackBehavior{
Wizard(){
attackBehavior=new FireMagicAttack();
}
@Override
public void Attack() {
attackBehavior.Attack();
}
}

class Warrior extends Hero implements AttackBehavior{
Warrior(){
attackBehavior=new PunchAttack();
}
@Override
public void Attack() {
attackBehavior.Attack();
}
}

class Knight extends Hero implements AttackBehavior{
Knight(){
attackBehavior=new SwordAttack();
}


@Override
public void Attack() {
attackBehavior.Attack();
}
}

class Sorceress extends Hero implements AttackBehavior{
Sorceress(){
attackBehavior=new IceMagicAttack();
}
@Override
public void Attack() {
attackBehavior.Attack();
}
}

public class main {
public static void main(String[] args) {
Wizard wizard=new Wizard();
Sorceress sorceress=new Sorceress();
Knight knight=new Knight();
Warrior warrior=new Warrior();

wizard.Attack();
sorceress.Attack();
knight.Attack();
warrior.Attack();

}
}

 

=====================================================================

위 코드에서는 공격명령을 캡슐화 하여 객체의 종류에 따라 Attack() 을 실행하였을 때 다른 공격이 실행된다.