观察者模式属于行为型模式的一种,该模式一般用来描述对象之间的依赖关系。
行为型模式:关注对象间的交互,研究对象间的相互作用,明确每一个对象职责。
观察者模式定义:定义对象之间的一种一对多的依赖关系,当一个对象状态发生改变时,其相关依赖的对象将被通知并自动更新。生活中比如股票的涨跌会影响股民的情绪的变化。
(一个对象变化时其依赖的对象会自动变化更新)
(类似于监听器)
如mvc模式就是用了观察者模式,观察者为View视图层,被观察对象为Model模型层,当Model变化时View会根据变化自 动更新数据
观察者模式主要解决问题:一方的状态发生了变化,依赖于这一方的观察者立即能收到通知。
如:例如我们平时订阅的微信公众号,一旦公众号有新的文章发布,订阅者能够立即收到新的文章推送。
这里需要注意的是,目标对象会把状态的变化通知所有观察者,而不管观察者的具体身份。自己也并不知道通知的这个人究竟是谁。
模式结构
(1)Subject(目标类):定义观察者集合。提供接口增加或删除观察者对象,定义通知方法。
(2)ConcreteSubject(具体目标):目标类子类,负责向各个观察者通知。
(3)Observer(观察者类):对所观察的目标的改变做出反应。
(4)ConcreteObserver(具体观察者):实现更新数据的方法。
举例:股民的反应根据股票的上涨和下跌做出不同反应,上涨时股民开心,下跌时股民伤心,
本例中股票为被观察者为目标类,股民为观察者,对股票变化反应
1、目标类(股票)
package com.mypachgong.See;
import java.util.ArrayList;
import java.util.List;
/**
* 股票上涨,股民开心,股票下跌股民伤心
* 股票情况为目标类
* 股民为观察者
**/
//subject目标类,观察者观察的对象(抽象类)
//定义观察者集合。提供接口增加或删除观察者对象,定义通知方法。
//一般我们会在在目标中定义一个观察者集合,用来管理观察者。
//一个观察目标可以接受任意数量的观察者来观察,它提供一系列方法来增加和删除观察者对象,
// 如attach()方法与detach()方法;同时也会定义通知方法notify()。
public abstract class Subject {
//定义一个观察者集合,用于管理观察者
protected List<Observer> observers = new ArrayList<>();
//向观察者集合中增加一个观察者对象
public void attach(Observer observer){
observers.add( observer );
}
//向观察者中删除一个观察者对象
public void delattach(Observer observer){
observers.remove( observer );
}
//抽象通知方法(股票上涨)
public abstract void increase();
//抽像通知方法(股票下跌)
public abstract void decrease();
}
2、具体目标
package com.mypachgong.See;
//具体目标对象,某一之股票,长江证券股票
//具体目标是目标类的子类(接口的实现者),通常它包含有经常发生改变的数据,
// 当它的状态发生改变时,向它的各个观察者发出通知;
// 同时它还实现了在目标类中定义的抽象业务逻辑方法
public class changjiangzehngquan extends Subject {
@Override
public void increase() {
System.out.println( "股票上涨了" );
//遍历观察者集合,调用每个观察者的响应方法
for (Observer o : observers) {//子类继承父类的对象observers
o.happy();//目标对象发生变化,调用观察者的方法更新数据
}
}
@Override
public void decrease() {
System.out.println( "股票下跌了" );
for (Observer o : observers) {
o.terrible();
}
}
}
3、观察者类(股民)
package com.mypachgong.See;
//观察者(接口)
//对所观察的目标的改变做出反应。
//观察者角色一般是一个接口,它会有一个update方法,
// 当目标对象的状态发生改变时,这个方法就会被调用。
public interface Observer {
public void happy();
public void terrible();
}
4、具体观察者
package com.mypachgong.See;
public class Gupiao implements Observer {
@Override
public void happy() {
System.out.println("股民开心");
}
@Override
public void terrible() {
System.out.println("股民难受");
}
}
5、测试类
package com.mypachgong.See;
//测试类
public class Test {
public static void main(String[] args) {
Subject s=new changjiangzehngquan();
s.attach( new Gupiao() );
s.increase();
s.decrease();
}
}
输出结果
应用场景举例:
1、当买票支付后,买票人收到短信。
2、微博订阅,当关注某人微博后,该博主发布的消息会向所有观察者(关注者推送)