类结构图
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进行遍历。



京公网安备 11010502036488号