观察者模式:定义对象之间一对多依赖关系,当被依赖对象的状态转变时,所有依赖对象能收到通知和更新自己。
应用场景:(1)当一个对象改变时,需要改变其他对象,但并不了解其他对象的数量。
(2)当一个对象应当负责通知其他对象的职责实现时,降低通知对象和被通知对象的耦合。
缺点:被观察者对象的状态更新可能会引起观察者级联更新。
结构图:

emmm直接放类图和代码啦!

(1)Observer(观察者类):
package 观察者模式;
public abstract class Observer {
public abstract void Update();
}
(2)ConcreteObserver(具体观察者类):
package 观察者模式;
public class ConcreteObserver extends Observer{
private String name;
private String observerState;
private ConcreteSubject subject;
public ConcreteObserver(ConcreteSubject subject,String name) {
this.subject = subject;
this.name = name;
}
public void Update() {
observerState = subject.getState();
System.out.println("观察者"+name+"的状态更新为:"+observerState);
}
}
(3)Subject(被观察者类):
package 观察者模式;
import java.util.ArrayList;
public abstract class Subject {
private ArrayList<Observer> observers = new ArrayList<Observer>();
public void Attach(Observer o) {
observers.add(o);
}
public void Detach(Observer o) {
observers.remove(o);
}
public void Notify() {
for(int i=0;i<observers.size();i++) {
observers.get(i).Update();
}
}
}
(4)ConcreteSubject(具体被观察者类):
package 观察者模式;
public class ConcreteSubject extends Subject{
private String subjectState;
public String getState() {
return this.subjectState;
}
public void setState(String s) {
this.subjectState = s;
}
}
(5)客户端调用:
package 观察者模式;
public class Main {
public static void main(String[] args) {
ConcreteSubject s = new ConcreteSubject();
s.Attach(new ConcreteObserver(s,"X"));
s.Attach(new ConcreteObserver(s,"Y"));
s.Attach(new ConcreteObserver(s,"Z"));
s.setState("睡觉了");
s.Notify();
}
}