1、观察者模式,个人理解为发布/订阅关系。订阅者为观察者,发布者为被观察者。同时观察者模式jdk提供了自带的版本。使用哪一个就看书写者的心情了。
简单的讲观察者模式类似买报纸,使用观察者模式后,报纸发行商只要报纸有更新,就会派人将报纸发送给各个用户。非观察者模式则需要各个用户有时间了去找发行商。
2、观察者模式实现步骤
(1)定义观察者(报纸用户,订阅者),被观察者(报纸发行商,发布者)两个接口。观察者需要提供更新消息的接口。被观察者需要实现观察者的订阅方法、移除订阅方法、更新消息的方法等。
(2)定义两个接口的实现类,用以执行具体功能。
(3)就是具体实现了,观察者需要订阅被观察者,被观察者讲更新相关消息将同步到其他观察者。
3、自定义观察者模式实现
(1)两个接口Observer、Subject。Subject为被观察者接口,Observer为观察者接口。接口代码如下:
/**
* 观察者接口
*/
public interface demoObserver {
public void demoUpdate(String str);
}
/**
* 报纸发行方接口
* 被观察者
*/
public interface demoSubject {
public void addUser(demoObserver obj); //添加订阅者
public void removeUser(demoObserver obj); //移除订阅
public void dataChange(String str); //更新
}
(2)填写接口实现类
/**
* 报纸订阅用户i
* 观察者
*/
public class user1 implements demoObserver{
@Override
public void demoUpdate(String str) {
System.out.println("用户1收到了报纸:"+str);
}
}
//发行方,被观察者
public class subject implements demoSubject {
public ArrayList<demoObserver> observer = new ArrayList<demoObserver>();
@Override
public void addUser(demoObserver obj) {
observer.add(obj);
}
@Override
public void removeUser(demoObserver obj) {
observer.remove(obj);
}
@Override
public void dataChange(String str) {
for(int i=0,len=observer.size();i<len;i++)
{
observer.get(i).demoUpdate(str);;
}
}
}
(3)测试案例
/**
* 手写观察模式
*/
public class Main {
public static void main(String[] args) {
user1 user1 = new user1();
user2 user2 = new user2();
user3 user3 = new user3();
subject sub = new subject();
sub.addUser(user1);
sub.addUser(user2);
sub.addUser(user3);
sub.dataChange("123");
}
}
4、java自带的观察者模式
java自带的观察者模式与自定义的观察者模式略有不同。个人不太喜欢这种方式,因为java不允许多继承,造成了无法定制化开发。如下
(1)被观察者(报纸发行方)不再是接口,而是类Observable。即你需要继承类而不是实现具体接口。观察者(报纸订阅用户)没有变化,需要实现接口Observer
(2)被观察者继承Observable之后,无需手写添加、移除订阅,以及更新消息等方法。
(3)被观察者继承于Observable,也无需手写添加、移除订阅等相关代码,
5、java自带的观察者模式具体实现
(1)观察者实现Observer接口,被观察者继承Observable。代码如下
/**
* 被观察者即报纸发行方
*/
public class javaObservable extends Observable {
public void dataChange(String str){
this.setChanged(); //通知观察者有新的数据了
this.notifyObservers(str); //开始更换数据
}
}
/**
* j观察者,即用户订阅者
*/
public class javaObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("用户0接收到数据" + arg.toString());
}
}
(2)测试
public class main {
public static void main(String[] args) {
javaObservable observale = new javaObservable();
javaObserver observer = new javaObserver();
javaObserver1 observer1 = new javaObserver1();
javaObserver2 observer2 = new javaObserver2();
//添加订阅者
observale.addObserver(observer);
observale.addObserver(observer1);
observale.addObserver(observer2);
observale.dataChange("qwe");
}
}
网友评论