为什么会出现观察者模式?
举个例子:
小明让小红去黑黑的屋子找钥匙!
小红在找钥匙的过程中。小明一会就会问一下:“小红,钥匙找到了吗?你现在在哪里?”
小红每次都要回答。这让小红很烦恼。那么如何解决这个问题?
观察者模式,小红在找钥匙的过程中,主动联系小明告知小明当前自己的行为!
观察者模式:
Subject:主题 也就是小红
Observer:观察者 小刘
每当小红有新的行为时,小红都会通知小刘。小刘就可以告诉小明了。
代码如下:
我们先定义一个主题:
package com.handsome.thread2study.chapter4;
import java.util.ArrayList;
import java.util.List;
/**
* @author jiangkunli
* @date 2020-07-08 10:41 下午
* @description 观察者模式
*/
public class Subject {
// 主题内部包含多个观察者
private List<Observer> observerList = new ArrayList<>();
private int state;
public int getState() {
return this.state;
}
// 添加对应的观察者,也可以删除
public void attach(Observer observer) {
observerList.add(observer);
}
public void setState(int state) {
if (state == this.state) {
return;
}
this.state = state;
notifyAllObserver();
}
// 每当有变动时就会通知每一个观察者
private void notifyAllObserver() {
//
observerList.stream().forEach(Observer::update);
}
}
定义观察者:
package com.handsome.thread2study.chapter4;
/**
* @author jiangkunli
* @date 2020-07-08 10:52 下午
* @description 观察者抽象类,基类可以实现其抽象方法
*/
public abstract class Observer {
protected Subject subject;
// 观察者初始化时 主题会将观察者添加到自己的集合中
public Observer(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
public abstract void update();
}
package com.handsome.thread2study.chapter4;
/**
* @author jiangkunli
* @date 2020-07-08 10:57 下午
* @description 基类
*/
public class BinaryObserver extends Observer{
public BinaryObserver(Subject subject){
super(subject);
}
@Override
public void update() {
System.out.println("Binary String:" + Integer.toBinaryString(subject.getState())) ;
}
}
observerClient调用该方法:
package com.handsome.thread2study.chapter4;
/**
* @author jiangkunli
* @date 2020-07-08 11:05 下午
* @description 观察者client
*/
public class ObserverClient {
public static void main(String[] args) {
final Subject subject = new Subject();
new BinaryObserver(subject);
// new OctalObserver(subject);
System.out.println("======");
subject.setState(10);
subject.setState(20);
}
}
大家可以执行该方法 会发现,主题变更自己的属性,其观察者就会收到对应的消息并且打印出来
大家是不是对观察者有了一些新的认识,那我们就来看看观察者用在什么地方吧!下期再见!