首页 / 设计模式 / 设计模式——观察者模式
设计模式——观察者模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了设计模式——观察者模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3041字,纯文字阅读大概需要5分钟。
内容图文
场景设置
我班同学订阅了一些杂志,有杂质A,杂质B,订阅的同学有Ghost,Guang
现在每当杂质更新的时候就要向订阅了该杂志的同学发出通知以提醒他们。实现该逻辑的代码。
首先定义接口,我们需要一个Magzine
接口和Observer
接口。
用来赋予杂质和观察者应有的行为。
interface Observer{
publicvoidupdate();
}
abstract class Magzine{
protected String name;
protected String status;
protected List<Observer> observers = new ArrayList<Observer>();
abstractpublicvoidadd(Observer observer);
abstractpublicvoidrm(Observer observer);
abstractpublicvoidnotifyy();
}
对于杂志类来说,一定需要记录都有哪些人订阅了,因此需要有add方法和rm方法用来操作订阅者(观察者)。还需要有notifyy方法来通知这些订阅者更新信息。
同时,订阅者Observer
也需要获得提醒,于是拥有update
方法用来接收通知,当Magzine
类有更新的时候就会调用Observer的update方法通知他。
因此,Observer的具体对象如下:
class
Ghost
implements
Observer{
private Magzine magzine = null;
public Ghost(Magzine magzine){
this.magzine = magzine;
}
@Override
publicvoid update() {
System.out.println("Ghost:the magzine"+magzine.name +" has been updated");
}
}
classGuangimplementsObserver{private Magzine magzine = null;
public Guang(Magzine magzine){
this.magzine = magzine;
}
@Override
publicvoid update(){
System.out.println("Guang:the magzine"+magzine.name+" has been updated");
}
}
杂志Magzine的具体类如下:
class
MagA
extends
Magzine{
@Override
publicvoid add(Observer observer) {
observers.add(observer);
}
@Override
publicvoid rm(Observer observer) {
observers.remove(observer);
}
@Override
publicvoid notifyy() {
for(Observer ob:observers){
ob.update();
}
}
}
classMagBextendsMagzine{
@Override
publicvoid add(Observer observer) {
observers.add(observer);
}
@Override
publicvoid rm(Observer observer) {
observers.remove(observer);
}
@Override
publicvoid notifyy() {
for(Observer ob:observers){
ob.update();
}
}
}
在客户端调用的时候即可这样进行订阅:
public
static
void
main(String[] args){
//------------------初始化杂志和观察者--------------------
Magzine duzheMagzine = new MagA();
Magzine gaoxiaoMagzine = new MagB();
Observer aObserver = new Ghost(duzheMagzine);
Observer bObserver = new Guang(gaoxiaoMagzine);
duzheMagzine.name = "duzhe";
gaoxiaoMagzine.name = "gaoxiao";
//------------------观察者进行订阅-----------------------
duzheMagzine.add(aObserver);
gaoxiaoMagzine.add(bObserver);
//------------------杂志有更新---------------------------
duzheMagzine.status = "version1";
gaoxiaoMagzine.status= "version2";
//------------------主动通知读者--------------------------
duzheMagzine.notifyy();
gaoxiaoMagzine.notifyy();
}
执行结果为:
Ghost:the magzineduzhe has been updated
Guang:the magzinegaoxiao has been updated
观察者模式是通过被观察者保持拥有观察者的引用,从而可操纵观察者的”更新“方法;而观察者保留其订阅的”被观察者“的引用,从而可获得被观察者的状态信息。
观察者模式特点
模式动机
将一个系统分割成一系列互相协作的类有个很不好的副作用,即需要维护相关对象间的一致性。我们不希望为了维持一致性而使得各类紧密耦合。
但是该模式的一大好处就是,被观察者不需要知道到底有多少Observer在关注着他或者这些Observer都是哪些具体的类,只要他状态变化了,依次发出通知即可;而Observer也不用知道到底是哪个具体的”被观察者“给他发了消息,而是只用在意它本身所接受到的更新信息即可。
使用场景概括
当一个对象的改变需要通知其他对象或者同时改变其他对象的时候,而且它并不知道有多少具体对象有待改变时,应使用观察者模式。之所以将观察者和被观察者都定义为接口就是在接触耦合,使得双方都依赖于抽象而不是具体,这样双方各自的变化都不会影响到另一边。
原文:http://blog.csdn.net/langduhualangdu/article/details/44115395
内容总结
以上是互联网集市为您收集整理的设计模式——观察者模式全部内容,希望文章能够帮你解决设计模式——观察者模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。