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