本文介绍观察者模式,和通过jdk的实现来使用。
简介
观察者模式Observer是行为模式的一种
作用是当一个对象的状态发生变化时,能够自动通知其它关联对象,自动刷新对象状态
Observer模式提供给关联对象一种同步通信的手段,使得某个对象与依赖他的其它对象之间保持状态同步
结构图
实际上,jdk已经有相关的实现,在java.util
包中:
public interface Observer
作为观察者。一个可在观察者要得到 observable 对象更改通知时可实现 Observer 接口的类。
java.util.Observable
作为被观察者。可将其子类化,表示应用程序想要观察的对象。
具体可看文档
角色和职责
- Subject(被观察者):被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有的观察者对象。Subject需要维持(添加、删除、通知)一个观察者对象的队列列表。
- Concrete subject:被观察者的具体实现。包含一些基本的属性状态及其它操作
- Observer(观察者):接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个CallBack函数得到通知
- Concrete observer:观察者的具体实现。得到通知后将完成一些具体业务逻辑处理
实现
具体被观察者
package com.mym.designmodel.observer;
import java.util.Observable;
/**
* 职责:Concrete Subject(被观察者)被观察的对象
*/
public class BlogUser extends Observable{
public void publishBlog(String title,String content){
Blog blog = new Blog();
blog.setTitle(title);
blog.setContent(content);
System.out.println("博主发布新文章,标题:"+title+",内容:"+content);
this.setChanged(); //标识状态改变
this.notifyObservers(blog); //通知观察者,并传参数
}
}
观察者
package com.mym.designmodel.observer;
import java.util.Observable;
import java.util.Observer;
/**
* 职责:Concrete observer:观察者的具体实现。得到通知后将完成一些具体业务逻辑处理
*/
public class EditorObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
Blog blog = (Blog) arg;
System.out.println(" EditorObserver 收到博主的发布消息,发布的文章标题为:"+blog.getTitle()+" 内容为:"+blog.getContent());
}
}
观察者2
package com.mym.designmodel.observer;
import java.util.Observable;
import java.util.Observer;
/**
* 职责:Concrete observer:观察者的具体实现。得到通知后将完成一些具体业务逻辑处理
*/
public class ReaderObserver implements Observer{
@Override
public void update(Observable o, Object arg) {
Blog blog = (Blog) arg;
System.out.println(" ReaderObserver 收到博主的发布消息,发布的文章标题为:"+blog.getTitle()+" 内容为:"+blog.getContent());
}
}
文章
package com.mym.designmodel.observer;
public class Blog {
private String title;//标题
private String content;//内容
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
客户端client
package com.mym.designmodel.observer;
/**
* 测试
*/
public class MainClass{
public static void main(String[] args) {
BlogUser blogUser = new BlogUser();
//添加观察者
blogUser.addObserver(new ReaderObserver());
blogUser.addObserver(new EditorObserver());
blogUser.publishBlog("讲述Observer Model","这里是文章正文!");
}
}
执行:
博主发布新文章,标题:讲述Observer Model,内容:这里是文章正文!
EditorObserver 收到博主的发布消息,发布的文章标题为:讲述Observer Model 内容为:这里是文章正文!
ReaderObserver 收到博主的发布消息,发布的文章标题为:讲述Observer Model 内容为:这里是文章正文!
使用场景
根据介绍可知。类似于消息订阅使用模型的场景都可以使用这个模式,并且jdk本身就提供了实现,很方便