2)角色定义对象间的一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生改变时,它的所有观察者都会收到通知并自动更新相关内容。
3)编码实现
1、抽象主题(Subject):
它把所有观察者对象的引用保存到一个容器里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
2、具体主题(Concrete Subject):
将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
3、抽象观察者(Observer):
为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
4、具体观察者(Concrete Observer):
实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
- 抽象主题
package com.lll.designpattern.observer;
import java.util.ArrayList;
import java.util.List;
public interface MySubject {
List observerList = new ArrayList<>();
void subscribe(MyObserver observer);
void notifyPriceChanged();
}
- 具体主题
package com.lll.designpattern.observer;
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;
public interface MyObserver {
void recvPriceChangedMsg();
}
- 具体观察者
package com.lll.designpattern.observer;
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;
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!!!



