Observer Pattern

Pros

  • e

Cons

  • e

Example Explanation

[UML]

import java.util.ArrayList;

class Main
{

  public static void main(String[] args)
  {
    UnitTracker tracker = new UnitTracker();

    Unit warrior = new Unit("Warrior", 13, 3, 4, tracker);
    Unit archer = new Unit("Archer", 12, 8, 3, tracker);

    tracker.addObserver(warrior);
    tracker.addObserver(archer);

    tracker.notifyObservers();

    archer.hurt ( warrior.getDamage() );
    warrior.hurt( archer.getDamage() );
    //Warrior [13 HP]
    //Archer [12 HP]
    //---
    //Archer takes 4 damage.
    //Warrior [13 HP]
    //Archer [8 HP]
    //---
    //Warrior takes 3 damage.
    //Warrior [10 HP]
    //Archer [8 HP]
    //---
  }
}

class Unit implements IObserver
{
  private int life;
  private int mana;
  private int attack;
  private String name;
  private UnitTracker tracker;

  public Unit(String name, int life, int mana, int attack, UnitTracker tracker)
  {
    this.life = life;
    this.mana = mana;
    this.attack = attack;
    this.name = name;
    this.tracker = tracker;
  }

  public int getDamage()
  {
    if(mana >= 2 && life>0)
    {
      mana -= 2;
      return attack;
    }
    else if (life > 0)
    {
      mana += 3;
    }
    return 0;
  }
  public void hurt(int dmg)
  {
    System.out.println(name+" takes "+dmg+" damage.");
    life -= dmg;
    if(life<=0)
    {
      System.out.println(name+" has been killed.");
    }

    tracker.notifyObservers();
  }

  public void update()
  {
    System.out.println(name+" ["+life+" HP]");
  }
  public int getLife()
  {
    return life;
  }
}

class UnitTracker implements Subject
{
  private ArrayList<IObserver> observers;

  public UnitTracker()
  {
    observers = new ArrayList<IObserver>();
  }

  public void addObserver(IObserver o)
  {
    observers.add(o);
  }
  public void removeObserver(IObserver o)
  {
    observers.remove(o);
  }
  public void notifyObservers()
  {
    for( IObserver o : observers )
    {
      o.update();
    }
    System.out.println("---");
  }
}

interface Subject 
{
  public void addObserver(IObserver o);
  public void removeObserver(IObserver o);
  public void notifyObservers();
}
interface IObserver
{
  public void update();
}

Extra Resources

results matching ""

    No results matching ""