观察者模式
1、观察者模式(Observer Pattern)。定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。观察者模式属于行为模式
2、例子
首先观察者模式是一对多,观察者观察到某一事物的变化后,同志给多个事物,使他们来做出相应的不同的改变。例如:拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价,然后竞价者他们各自做出继续竞价、放弃或者者观望等。同时,JAVA 中已经有了对观察者模式的支持类。
3、观察者模式的优缺点
优点:
1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
缺点:
1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
4、代码
public class EntryptTest {
public static void main(String[] args) throws Exception {
Subject subject = new Subject();
//创建具体的观察者实体,并加入
new HexObserver(subject);
new OctalObserver(subject);
new BinaryObserver(subject);
System.out.println("First status change :10");
//通知观察者
subject.setStatus(10);
System.out.println("Second status change : 20");
subject.setStatus(20);
}
}
//创建一个subject类,来管理观察者
class Subject {
private List<Observer> observers = new ArrayList<>();
private int status;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
this.notifyAllObserver();
}
public void attach(Observer observer) {
observers.add(observer);
}
public void notifyAllObserver() {
observers.forEach(observer -> {
observer.update();
});
}
}
//创建实体观察者类
abstract class Observer {
protected Subject subject;
public abstract void update();
}
//创建具体的被观察者类
class BinaryObserver extends Observer {
public BinaryObserver(Subject subject) {
this.subject = subject;
subject.attach(this);
}
@Override
public void update() {
System.out.println("Binary String :" + Integer.toBinaryString(subject.getStatus()));
}
}
class OctalObserver extends Observer {
public OctalObserver(Subject subject) {
this.subject = subject;
subject.attach(this);
}
@Override
public void update() {
System.out.println("Octal String :" + Integer.toOctalString(subject.getStatus()));
}
}
class HexObserver extends Observer {
public HexObserver(Subject subject) {
this.subject = subject;
subject.attach(this);
}
@Override
public void update() {
System.out.println("Hex String :" + Integer.toHexString(subject.getStatus()));
}
}
运行结果:
First status change :10
Hex String :a
Octal String :12
Binary String :1010
Second status change : 20
Hex String :14
Octal String :24
Binary String :10100
分析:
观察者模式使用三个类 Subject、Observer 和 Client。Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。我们创建 Subject 类、Observer 抽象类和扩展了抽象类 Observer 的实体类。
main方法中:我们的演示类使用 Subject 和实体类对象来演示观察者模式。