Skip to content

Instantly share code, notes, and snippets.

@ByungJun25
Last active December 24, 2020 08:52
Show Gist options
  • Save ByungJun25/d14b8154437cc886d757111cad5f18d5 to your computer and use it in GitHub Desktop.
Save ByungJun25/d14b8154437cc886d757111cad5f18d5 to your computer and use it in GitHub Desktop.
Double dispatch example.
import java.util.Arrays;
import java.util.List;
public class Main {
public static abstract class Weapon {
protected int attackPoint;
public Weapon(int attackPoint) {
this.attackPoint = attackPoint;
}
public abstract double attackPoint(Warrior warrior);
public abstract double attackPoint(Magician magician);
public abstract double attackPoint(Archer archer);
}
public static abstract class Character {
public abstract void attack(Weapon weapon);
}
public static class Sword extends Weapon {
public Sword(int attackPoint) {
super(attackPoint);
}
@Override
public double attackPoint(Warrior warrior) {
return this.attackPoint;
}
@Override
public double attackPoint(Magician magician) {
return this.attackPoint * 0.3;
}
@Override
public double attackPoint(Archer archer) {
return this.attackPoint * 0.5;
}
}
public static class Arrow extends Weapon {
public Arrow(int attackPoint) {
super(attackPoint);
}
@Override
public double attackPoint(Warrior warrior) {
return this.attackPoint * 0.5;
}
@Override
public double attackPoint(Magician magician) {
return this.attackPoint * 0.3;
}
@Override
public double attackPoint(Archer archer) {
return this.attackPoint;
}
}
public static class Wand extends Weapon {
public Wand(int attackPoint) {
super(attackPoint);
}
@Override
public double attackPoint(Warrior warrior) {
return this.attackPoint * 0.3;
}
@Override
public double attackPoint(Magician magician) {
return this.attackPoint;
}
@Override
public double attackPoint(Archer archer) {
return this.attackPoint * 0.3;
}
}
public static class Warrior extends Character {
@Override
public void attack(Weapon weapon) {
System.out.println("Warrior attack! - "+ weapon.getClass().getSimpleName() +" attack point: " + weapon.attackPoint(this));
}
}
public static class Magician extends Character {
@Override
public void attack(Weapon weapon) {
System.out.println("Magician attack! - "+ weapon.getClass().getSimpleName() +" attack point: " + weapon.attackPoint(this));
}
}
public static class Archer extends Character {
@Override
public void attack(Weapon weapon) {
System.out.println("Archer attack! - "+ weapon.getClass().getSimpleName() +" attack point: " + weapon.attackPoint(this));
}
}
public static void main(String[] args) {
List<Weapon> weapons = Arrays.asList(new Sword(10), new Arrow(10), new Wand(10));
List<Character> characters = Arrays.asList(new Warrior(), new Magician(), new Archer());
characters.forEach(c -> weapons.forEach(w -> c.attack(w)));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment