코드 먼저 보겠다.
interface Weapon{
public void handle();
}
class Wand implements Weapon{
public void handle(){
System.out.println("Wide area attack");
}
}
class Sword implements Weapon{
public void handle(){
System.out.println("Sword attack");
}
}
class Bible implements Weapon{
public void handle(){
System.out.println("Heal");
}
}
interface JobActive{
public void active();
}
class Warrior implements JobActive{
private Weapon weapon;
public Warrior(Weapon weapon){
this.weapon = weapon;
}
public void active(){
System.out.print("Warrior ");
weapon.handle();
}
}
class Mage implements JobActive{
private Weapon weapon;
public Smith(Weapon weapon){
this.weapon = weapon;
}
public void active(){
System.out.print("Mage ");
weapon.handle();
}
}
class Prist implements JobActive{
private Weapon weapon;
public Smith(Weapon weapon){
this.weapon = weapon;
}
public void active(){
System.out.print("Prist ");
weapon.handle();
}
}
기능 부와 구현부를 나누는.. 그냥 인터페이스 이야기 인 듯 하다.
이렇게 구현부를 분리시켜 놓으면 의존성이 유연해지기 때문에 무기를 다양하게 늘릴 수 있다.(Sword, Bible 등)
JobActive 부분에서도 Weapon에 대해 구체적으로 알지 못해도 그냥 무기의 용도 ( 검이면 휘두르기, 지팡이면 광역마법 등)에 맞게 알아서 사용이 된다.
JobActive도 마찬가지로 상속받아서 public active 구현부와 선언부를 따로 나눠놔 알아서 각자의 역할이 실행된다.
그리고 Mage가 Sword를 사용하게도 할 수 있다.
만약 Warrior가 Bow와 Sword 둘 다 사용할 수 있게 구현하고 싶다면 bowActive, swordActive 따로 구현 해야했겠지만 이렇게 하면 의존성을 없엘 수 있다.