观察者模式应用场景
在我们开发的过程中,经常会遇到一些当什么什么事情发生的时候,然后做什么什么事。比如某种商品的物价上涨时会导致部分商家高兴,而消费者伤心。
代码示例
抽象被观察者类
package com.demo.test.observe.abs;
import java.util.ArrayList;
import java.util.List;
public abstract class Subject {
private List<Observe> observeList = new ArrayList<>();
public void attach(Observe observe){
this.observeList.add(observe);
};
public void detach(Observe observe){
this.observeList.remove(observe);
};
public void allNotify(){
for(Observe observe:observeList){
observe.update();
}
}
}
抽象观察者类
package com.demo.test.observe.abs;
public abstract class Observe {
public abstract void update();
}
具体被观察者类
package com.demo.test.observe;
import com.demo.test.observe.abs.Subject;
import java.util.List;
public class SubjectA extends Subject {
}
具体观察者1
package com.demo.test.observe;
import com.demo.test.observe.abs.Observe;
public class StudentObserve extends Observe {
public void update(){
System.out.println("老师来了,快坐好");
}
}
具体观察者2
package com.demo.test.observe;
import com.demo.test.observe.abs.Observe;
public class StudentBObserve extends Observe {
@Override
public void update() {
System.out.println("老师来了,别吃了");
}
}
客户端
package com.demo.test.observe;
import com.demo.test.observe.abs.Observe;
import com.demo.test.observe.abs.Subject;
public class Client {
public static void main(String[] args){
Subject subjectA = new SubjectA();
Observe studentObserve = new StudentObserve();
subjectA.attach(studentObserve);
subjectA.attach(new StudentBObserve());
subjectA.allNotify();
}
}
JAVA 自带的观察者类
被观察者
package com.demo.test.observe.javaObserve;
import java.util.Observable;
public class Subject1 extends Observable {
public void change(){
setChanged(); //如果不执行setChanged,就不会调用update函数。
}
}
观察者A
package com.demo.test.observe.javaObserve;
import java.util.Observable;
import java.util.Observer;
public class ObserveA implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("java 自带观察者:A");
}
}
观察者B
package com.demo.test.observe.javaObserve;
import java.util.Observable;
import java.util.Observer;
public class ObserveB implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("java 自带观察者:B");
}
}
客户端
package com.demo.test.observe.javaObserve;
import java.util.Observable;
import java.util.Observer;
public class Client {
public static void main(String[] args){
Subject1 subject = new Subject1();
Observer observerA = new ObserveA();
Observer observerB = new ObserveB();
subject.addObserver(observerA);
subject.addObserver(observerB);
//这一步主要调用里面的setChanged,否则update不执行。setChanged必须在Observable继承类内执行,因为它是protected修饰的。
subject.change();
subject.notifyObservers();
}
}