1. java自带的实现
类图
/**
* 观察目标 继承自 java.util.observable
* @author stone
*
*/
public class updateobservable extends observable {
private int data;
public updateobservable(observer observer) {
addobserver(observer);
/*
* add other observer
*/
}
public int getdata() {
return data;
}
public void setdata(int data) {
if (data != this.data) {
this.data = data;
setchanged(); //标记 改变, 只有标记后才能通知到
notifyobservers(); //通知
}
}
@override
public synchronized void addobserver(observer o) {
super.addobserver(o);
}
@override
public synchronized void deleteobserver(observer o) {
super.deleteobserver(o);
}
@override
public void notifyobservers() {
super.notifyobservers();
}
@override
public void notifyobservers(object arg) {
super.notifyobservers(arg);
}
@override
public synchronized void deleteobservers() {
super.deleteobservers();
}
@override
protected synchronized void setchanged() {
super.setchanged();
}
@override
protected synchronized void clearchanged() {
super.clearchanged();
}
@override
public synchronized boolean haschanged() {
return super.haschanged();
}
@override
public synchronized int countobservers() {
return super.countobservers();
}
}
/**
* 观察者 实现 java.util.observer接口
* @author stone
*
*/
public class updateobserver implements observer {
@override
public void update(observable o, object arg) {
system.out.println("接收到数据变化的通知:");
if (o instanceof updateobservable) {
updateobservable uo = (updateobservable) o;
system.out.print("数据变更为:" + uo.getdata());
}
}
}
2. 自定义的观察模型
类图
/**
* 抽象观察者 observer
* 观察 更新
* @author stone
*
*/
public interface iwatcher {
/*
* 通知接口:
* 1. 简单通知
* 2. 观察者需要目标的变化的数据,那么可以将目标用作参数, 见java的observer和observable
*/
// void update(iwatched watched);
void update();
}
/**
* 抽象目标 subject
* 提供注册和删除观察者对象的接口, 及通知观察者进行观察的接口
* 及目标 自身被观察的业务的接口
* @author stone
*
*/
public interface iwatchedsubject {
public void add(iwatcher watch);
public void remove(iwatcher watch);
public void notifywhatchers();
public void update();//被观察业务变化的接口
}
/**
* 具体观察者 concrete observer
*
* @author stone
*
*/
public class updatewatcher implements iwatcher {
@override
public void update() {
system.out.println(this + "观察到:目标已经更新了");
}
}
/**
* 具体目标角色 concrete subject
* @author stone
*
*/
public class updatewatchedsubject implements iwatchedsubject {
private list<iwatcher> list;
public updatewatchedsubject() {
this.list = new arraylist<iwatcher>();
}
@override
public void add(iwatcher watch) {
this.list.add(watch);
}
@override
public void remove(iwatcher watch) {
this.list.remove(watch);
}
@override
public void notifywhatchers() {
for (iwatcher watcher : list) {
watcher.update();
}
}
@override
public void update() {
system.out.println("目标更新中....");
notifywhatchers();
}
}
监听器是观察者的一种实现
类图
/**
* 监听 用户在注册后
* @author stone
*
*/
public interface iregisterlistener {
void onregistered();
}
/**
* 监听 当用户登录后
* @author stone
*
*/
public interface iloginlistener {
void onlogined();
}
/*
* 监听器 是观察者模式的一种实现
* 一些需要监听的业务接口上添加 监听器,调用监听器的相应方法,实现监听
*/
public class user {
public void register(iregisterlistener register) {
/*
* do ... register
*/
system.out.println("正在注册中...");
//注册后
register.onregistered();
}
public void login(iloginlistener login) {
/*
* do ... login
*/
system.out.println("正在登录中...");
//登录后
login.onlogined();
}
}
/**
* 观察者(observer)模式 行为型模式
* 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时观察某一个目标对象。
* 这个目标对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己
* 目标对象中需要有添加、移除、通知 观察者的接口
*
* @author stone
*/
public class test {
public static void main(string[] args) {
/*
* 使用java自带的observer接口和observable类
*/
updateobservable observable = new updateobservable(new updateobserver());
observable.setdata(99);
system.out.println("");
system.out.println("");
/*
* 自定义的观察者模型
*/
iwatchedsubject watched = new updatewatchedsubject();
watched.add(new updatewatcher());
watched.add(new updatewatcher());
watched.update();
system.out.println("");
/*
* 子模式-监听器
*/
user user = new user();
user.register(new iregisterlistener() {
@override
public void onregistered() {
system.out.println("监听到注册后。。。");
}
});
user.login(new iloginlistener() {
@override
public void onlogined() {
system.out.println("监听到登录后。。。");
}
});
}
}
打印
接收到数据变化的通知:
数据变更为:99
目标更新中....
observer.updatewatcher@457471e0观察到:目标已经更新了
observer.updatewatcher@5fe04cbf观察到:目标已经更新了
正在注册中...
监听到注册后。。。
正在登录中...
监听到登录后。。。
以上就是java实现观察者(observer)模式实例详情(图)的详细内容。