观察者模式具体定义是一对多的依赖关系而存在的.一个以上观察者监听同一个topic.这么说,当观察者状态改变理论上是需要通知其他观察者,使之联动更新
观察者的图解
在被观察者类中需要有一个集合维护所有观察者。
subject (被观察的对象接口) 属于concretesubject的统一接口,每个subject可以有多个observer
concretesubject(被观察对象) 维护对所有观察者引用的列表 状态改变时候就会送通知到注册的观察者
observer(观察者接口)规定concreteobserver的统一接口,定义update方法 当被观察者状态改变就调用
concreteobserver(具体观察者)维护一个对concretesubject的引用,特定状态跟concretesubjext同步,实现obsercer接口和update方法调用
重点:一旦检测到subject变动就更新信息
自己定义接口或者类来实现观察者模式
定义被观察者所具有的接口
public interface Observable {
//注册为一个观察者
public void registerObserver(Observer observer);
//取消观察者
public void removeObserver(Observer observer);
//通知所有观察者更新信息
public void notifyObservers();
}
定义具体的被观察者:杯子
public class Cup implements Observable{
//被观察者维护的一个观察者对象列表
private Vector<Observer> vector = new Vector<Observer>();
private float price;
public Cup(float price){
this.price = price;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
//修改价格时,通知所有观察者
this.price = price;
notifyObservers();
}
@Override
public void registerObserver(Observer observer) {
//注册观察者
vector.add(observer);
}
@Override
public void removeObserver(Observer observer) {
//取消观察者
vector.remove(observer);
}
@Override
public void notifyObservers() {
//实现通知所有的观察者对象
for (Observer observer:vector) {
observer.update(price);
}
}
}
定义观察者所具有的共同的接口
public interface Observer { public void update(float price);}
public class Person implements Observer{
private String name;
public Person(String name){
this.name = name;
}
@Override
public void update(float price) {
System.out.println(name+"关注的杯子的价格已更新为:"+price);
}
}
public static void main(String[] args) {
//创建一个被观察者对象
Cup doll = new Cup(3000);
//创建两个观察者对象
Person p1 = new Person("健力宝1");
Person p2 = new Person("健力宝2");
//注册成为一个观察者
doll.registerObserver(p1);
doll.registerObserver(p2);
System.out.println("第一轮促销:");
doll.setPrice(2698);// 价格变动
System.out.println("第二轮促销:");
doll.setPrice(2299);//
System.out.println("第三轮促销:");
doll.setPrice(1998);
doll.removeObserver(p2); //将生命二号移除
System.out.println("第四轮促销:");
doll.setPrice(1098);
}
输出的结果是
第一轮促销:
健力宝1关注的杯子的价格已更新为:2689.0
健力宝2关注的杯子的价格已更新为:2689.0
第二轮促销:
健力宝1关注的杯子的价格已更新为:2299.0
健力宝2关注的杯子的价格已更新为:2299.0
第三轮促销:
健力宝1关注的杯子的价格已更新为:1998.0
健力宝2关注的杯子的价格已更新为:1998.0
第四轮促销:
健力宝1关注的杯子的价格已更新为:1098.0
总结
观察者模式:被观察与观察者之间存在抽象耦合关系.被观察所知道的是一个具体的观察者列表
应用场景:
三个条件:观察者 被观察,话题订阅
按上述说的关系,实际应用最广泛显然可见就是 公众号推送消息,独立的微信号关注多个公众号 ,每次总能收到公众号发部的更新内容
订阅号也会将公众号置顶标红提醒.
这就是典型的观察者模式.
一个或者多个公众号视为被观察者,用户微信则为订阅话题与被观察者建立一对多关系.自然用户就是属于观察者了
|
|