一、情景:
老王、老李、老张都让媒婆帮他们找对象。
二、 情景后续:
媒婆得到消息后、居然懒得一个一个通知
三、观察者模式(Observer)
针对上面媒婆的处境我们可以使用观察者模式来解决。观察者模式是一种行为设计模式。观察者模式的用途是,当你对一个对象的状态感兴趣,希望在它每次发生变化时获得通知。在观察者模式中,观察另外一个对象状态的对象叫做Observer观察者,被观察的对象叫着Subject被观察者。
- 定义了定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他所有的依赖者都会收到通知并自动更新
- 重要组件
- Subject(被观察者)包含了一些需要在其状态改变时通知的观察者
- Observer(观察者),当被观察者发生改变时会通知观察者。
四、代码演示
4.1类图
- 观察者中其实还维护者被观察者,因为观察者需要把自己注册进去,在下面的代码中有体现
4.2观察者接口
/**
* @author liuzihao
* @create 2020-09-20-18:56
*/
public interface ObserverI {
public void update();
}
4.3不同的观察者
- 观察者老王
public class ObserverW implements ObserverI{
private SubjectI subjectI;
public ObserverW(SubjectI subjectI) {
this.subjectI = subjectI;
subjectI.add(this);
}
@Override
public void update() {
System.out.println("老王:快来看老婆啦");
}
}
- 观察者老李
public class ObserverL implements ObserverI {
private SubjectI subjectI;
public ObserverL(SubjectI subjectI) {
this.subjectI = subjectI;
subjectI.add(this);
}
@Override
public void update() {
System.out.println("老李:快来看老婆啦");
}
}
- 观察者老张
public class ObserverZ implements ObserverI {
private SubjectI subjectI;
public ObserverZ(SubjectI subjectI) {
this.subjectI = subjectI;
subjectI.add(this);
}
@Override
public void update() {
System.out.println("老张:快来看老婆啦");
}
}
4.4消息的发布者(被观察者)
- 被观察的媒婆
在媒婆这里拿有每个观察者的信息,当他收到小姐姐的信息,媒婆只需要调用notifyAll方法即可
public interface SubjectI {
public void add(ObserverI observerI);
public void remove(ObserverI observerI);
public void notifyObserver();
}
public class SubjectMeiPo implements SubjectI {
private List<ObserverI> obervers = new ArrayList<>();
@Override
public void add(ObserverI observerI) {
obervers.add(observerI);
}
@Override
public void remove(ObserverI observerI) {
for (ObserverI oberver : obervers) {
if (oberver.equals(observerI)){
obervers.remove(oberver);
break;
}
}
}
@Override
public void notifyObserver() {
obervers.stream().forEach(ObserverI::update);
}
}
5、代码测试
/**
* @author liuzihao
* @create 2020-09-20-19:18
*/
public class MainDemo {
public static void main(String[] args) {
//1、初始化被观察者(媒婆)
SubjectI subjectI = new SubjectMeiPo();
// 2、初始化观察者
ObserverI lw = new ObserverW(subjectI);
ObserverI lz = new ObserverZ(subjectI);
ObserverI ll = new ObserverL(subjectI);
System.out.println("准备工作完毕");
System.out.println("哇!- 我收到了一个小姐姐的消息赶紧通知他们 ");
subjectI.notifyObserver();
System.out.println("全部通知完咯,那就看他们谁先抢到吧");
}
}
五、小结
观察者模式的一大特点其实就是松耦合、被观察的对象只知道观察者,实现了同一个接口如:update,而不需要知道具体的实现,所以当当又来了单身老吴
,他想托媒婆帮他找老婆的话,那么他只需要,实现改接口,即可,当媒婆有小姐姐的资料时也会通知到,单身老吴
.