观察者模式

定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都能得到通知并被自动更新
简单来说: 被观察者发生改变 通知观察者
好处 程序不用实时检索 一些数据的更新

观察者模式里有两个元素
1.被观察者
2.观察者
之间的关于 订阅关系
Java中 已经定义出了 两个类 Observable 类和 Observer接口
为了更好的理解观察者模式

下面通过一个简单的例子 理解一下这个设计模式
/**
* author:
* date:2018/2/27;14:31
* use: 被观察的对象 被观察者中的数据
*/

public class Weather {
private String info ;

public String getInfo() {
return info ;
}

public void setInfo(String info) {
this . info = info;
}

@Override
public String toString() {
return "Weather{" +
"info='" + info + ' \' ' +
'}' ;
}
}

接下来是被观察者 按照一些思路定义
/**
* author:
* date:2018/2/27;14:35
* use:被观察者
* 一但被观察者发生改变 通知观察者
* 被观察的对象 写在这个类里面
* 一个被观察者 有一个或多个观察者观察它 是一对多的关系(包含一对一)
* 所以此类中要有一个 保存观察者的 容器 这里用的集合
*
* 观察者和被观察者要形成订阅关系 和解除订阅关系
*
* 数据发生变化通知观察者
*/

public class Observable< T > {
//用于存储观察者的集合
ArrayList<Observer< T >> mObservers = new ArrayList<>();

//订阅
public void register(Observer< T > observer) {
if (observer == null ) {
throw new NullPointerException( "观察者为空" );
}
synchronized ( this ) {
if (! mObservers .contains(observer))
mObservers .add(observer);
}
}
//解除订阅关系
public synchronized void unregister(Observer< T > observer) {
mObservers .remove(observer);
}

//通知观察者
public void notifyObservers( T data) {
for (Observer< T > observer : mObservers ) {
observer.upDate( this ,data);
}
}
}

然后是观察者
**
* author:
* date:2018/2/27;14:34
* use: 观察者
*/

public interface Observer< T > {
void upDate(Observable< T > observable, T date);
}

最后是测试代码 一个Activity

//这个Activity 实现了 观察者接口
public class MainActivity extends AppCompatActivity implements Observer<Weather>{

@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout. activity_main );



//模拟请求到的数据
Weather weather= new Weather();
weather.setInfo( "多云转阴" );
//被观察者
Observable<Weather> observable = new Observable<>();
//和观察者成订阅关系
observable.register( this );
//通知 改变
observable.notifyObservers(weather);

//实际中红色部分代码 在得到数据是使用 当数据发生改变时 通知到界面
}

@Override
public void upDate(Observable<Weather> observable, Weather date) {
//在这里收到数据
Log. d ( "MainActivity" , "upDate: " +date.toString());

}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值