概述:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
角色: 1. Subject(目标) 目标知道它的观察者。可以有任意多个观察者观察同一个目标。 提供注册和删除观察者对象的接口 2. Observer(观察者) 为那些在目标发生改变时需获得通知的对象定义一个更新接口 3. ConcreteSubject(具体目标) 将有关状态存入各ConcreteObserver对象。当它的状态发生改变时,向它的各个观察者发出通知 4. ConcreteObserver(具体观察者) 维护一个指向ConcreteSubject对象的引用。存储有关状态,这些状态应与目标的状态保持一致。 实现Observer的更新接口以使自身状态与目标的状态保持一致
类图
实现: 被观察者接口:
interface Observer { public void support(); public void beAttached(CommandCentre commandCentre); public String getName(); public void setName(String name); }具体实现
public class Player implements Observer { private String name; public Player(String name) { this.name = name; } @Override public void support() { System.out.println("别慌,"+this.name+"来助你一臂之力!"); } @Override public void beAttached(CommandCentre commandCentre) { commandCentre.notifyAll(this.name); } public String getName() { return name; } public void setName(String name) { this.name = name; } }目标抽象类
abstract class CommandCentre { protected ArrayList<Observer> players = new ArrayList<Observer>(); public void join(Observer obs) { System.out.println(obs.getName() + "加入战队!"); players.add(obs); } //注销方法 public void quit(Observer obs) { System.out.println(obs.getName() + "退出战队!"); players.remove(obs); } public abstract void notifyAll(String name); }具体实现:
public class DirectCommandCenter extends CommandCentre { @Override public void notifyAll(String name) { System.out.println("战队紧急通知,盟友" + name + "遭受敌人攻击,需要支援!"); //遍历观察者集合,调用每一个盟友(自己除外)的支援方法 for(Object obs : players) { if (!((Observer)obs).getName().equalsIgnoreCase(name)) { ((Observer)obs).support(); } } } }测试
public class testObserver { public static void main(String[] args) { CommandCentre directCommandCenter = new DirectCommandCenter(); Observer observer1 = new Player("郭靖"); directCommandCenter.join(observer1); Observer observer2 = new Player("孙悟空"); directCommandCenter.join(observer2); Observer observer3 = new Player("贾宝玉"); directCommandCenter.join(observer3); Observer observer4 = new Player("乾隆"); directCommandCenter.join(observer4); Observer observer5 = new Player("凤姐"); directCommandCenter.join(observer5); observer5.beAttached(directCommandCenter); } }打印 郭靖加入战队! 孙悟空加入战队! 贾宝玉加入战队! 乾隆加入战队! 凤姐加入战队! 战队紧急通知,盟友凤姐遭受敌人攻击,需要支援! 别慌,郭靖来助你一臂之力! 别慌,孙悟空来助你一臂之力! 别慌,贾宝玉来助你一臂之力! 别慌,乾隆来助你一臂之力!