1)设计思想
定义对象间的一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生改变时,它的所有观察者都会收到通知并自动更新相关内容。
2)角色
1、抽象主题(Subject):
它把所有观察者对象的引用保存到一个容器里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
2、具体主题(Concrete Subject):
将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
3、抽象观察者(Observer):
为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
4、具体观察者(Concrete Observer):
实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
3)编码实现
- 抽象主题
package com.lll.designpattern.observer;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName : MySubject
* @Description: 主题接口类
* @Author: liulianglin
* @Date: 2021/11/26 22:36
* @Version : 1.0
*/
public interface MySubject {
List<MyObserver> observerList = new ArrayList<>();
/**
* 订阅
* @param observer
*/
void subscribe(MyObserver observer);
/**
* 价格变动通知
*/
void notifyPriceChanged();
}
- 具体主题
package com.lll.designpattern.observer;
/**
* @ClassName : ConcreteSubject
* @Description: 具体主题
* @Author: liulianglin
* @Date: 2021/11/26 22:46
* @Version : 1.0
*/
public class ConcreteSubject implements MySubject {
@Override
public void subscribe(MyObserver observer) {
observerList.add(observer);
}
@Override
public void notifyPriceChanged() {
for (MyObserver observer : observerList){
observer.recvPriceChangedMsg();
}
}
}
- 抽象观察者
package com.lll.designpattern.observer;
/**
* @ClassName : MyObserver
* @Description: 观察者接口,定义了观察的行为
* @Author: liulianglin
* @Date: 2021/11/26 22:43
* @Version : 1.0
*/
public interface MyObserver {
void recvPriceChangedMsg();
}
- 具体观察者
package com.lll.designpattern.observer;
/**
* @ClassName : ConcreteObserver
* @Description: 真实的观察者类,通过new它生成一个个具体的观察者实例
* @Author: liulianglin
* @Date: 2021/11/26 22:48
* @Version : 1.0
*/
public class ConcreteObserver implements MyObserver {
private String observerName;
public ConcreteObserver(String observerName){
this.observerName = observerName;
}
public String getObserverName() {
return observerName;
}
public void setObserverName(String observerName) {
this.observerName = observerName;
}
@Override
public void recvPriceChangedMsg() {
System.out.println(observerName+"接收到了来自平台的价格变动通知....");
}
}
- 测试类
package com.lll.designpattern.observer;
/**
* @ClassName : MainTest
* @Description: 测试类
* @Author: liulianglin
* @Date: 2021/11/26 22:49
* @Version : 1.0
*/
public class MainTest {
public static void main(String[] args) {
MySubject subject = new ConcreteSubject();
MyObserver observerA = new ConcreteObserver("张三");
MyObserver observerB = new ConcreteObserver("李四");
MyObserver observerC = new ConcreteObserver("王五");
subject.subscribe(observerA);
subject.subscribe(observerB);
subject.subscribe(observerC);
subject.notifyPriceChanged();
}
}
- 测试结果输出
OVER!!!