类结构图
UML图
初步理解
当使用观察者模式时,当一个状态发生变化,那么观察者会一一通知加入到观察者集合中的类。
代码理解
底部抽象类
public abstract class Observer { protected Subject subject; public abstract void update(); }
观察者类
int为变化的状态,list装需要观察int状态的对象。
public class Subject { private List<Observer> list = new ArrayList<Observer>(); private int state; public int getState() { return state; } public void setState(int state) { this.state = state; notifyAllObservers(); } public void attach(Observer observer){ list.add(observer); } public void notifyAllObservers(){ for (int i=0;i<list.size();i++) { list.get(i).update(); } } }
抽象类的实现类(3个)
public class Timi extends Observer { public Timi(Subject subject){ this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println( "Timi收到了消息并更新了版本 " + 3+subject.getState() ); } } public class LOL extends Observer{ public LOL(Subject subject){ this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println( "LOL收到了消息并更新版本 " + subject.getState() ); } } public class Steam extends Observer{ public Steam(Subject subject){ this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println( "Steam收到了通知并更新了版本 "+ (subject.getState()+3) ); } }
测试类
public class Demo { public static void main(String[] args) { Subject subject = new Subject(); new LOL(subject); new Timi(subject); new Steam(subject); System.out.println("发送第一个消息"); subject.setState(4); System.out.println("发送第二个消息"); subject.setState(5); } }
测试结果
发送第一个消息 LOL收到了消息并更新版本 4 Timi收到了消息并更新了版本 34 Steam收到了通知并更新了版本 7 发送第二个消息 LOL收到了消息并更新版本 5 Timi收到了消息并更新了版本 35 Steam收到了通知并更新了版本 8
总结
观察者进行通知行为,是因为其内部有一个List,需要通知的对象,必须添加到这个list中。然后发通知后,对list进行遍历。