定义:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新
说的再简单些就是微信公众号与订阅人之间的一个关系,这个模式中主要由四部分组成,详细如下:
被观察者接口(Observable Interface):这个接口定义了一个主题,可以有一个集合保存了有哪些观察者订阅了该主题
被观察者(Observableimpl):是被观察者接口的实现类,好比一个个微信公众号的实例
观察者接口(Observer Interface):这个接口定义了观察者,在被观察者更新数据后及时通知自己
观察者(Observer):观察者接口的实现类
闲话休说,附上代码就简单明了:
被观察接口:
package observer;
import java.util.List;
/**
* @author Fever1
* @Description 定义被观察者接口,添加,删除,通知,取得集合四个方法
**/
public interface Observable {
//添加观察者
public void registerObserver(Observer user);
public void registerObserber(List<Observer> users);
//删除观察者
public void removeObserver(Observer o);
//取得观察者的集合
public List<Observer> getObserver();
//通知观察者
public void notifyObserver();
}
被观察者的实现类:
package observer;
import java.util.ArrayList;
import java.util.List;
/**
* @author F3ver1
* @date 2019/4/20 22:01
*/
public class Observableimpl implements Observable {
private List<Observer> list = new ArrayList<>();
private String message;
public Observableimpl(){
}
//
@Override
public void registerObserver(Observer user) {
list.add(user);
user.setObservable(this);
}
@Override
public void registerObserber(List<Observer> users) {
list.addAll(users);
}
@Override
public void removeObserver(Observer user) {
if (!list.isEmpty()) {
list.remove(user);
}
}
@Override
public List<Observer> getObserver() {
return list;
}
//遍历告知所有订阅者
@Override
public void notifyObserver() {
for (int i = 0; i < list.size(); i++) {
Observer observer = list.get(i);
observer.update(message);
}
}
public void setMessage(String message) {
this.message = message;
System.out.println("已更新信息:" + message);
notifyObserver();
}
}
观察者接口:
package observer;
/**
* @author Fever1
* @Description 定义观察者接口,更新,取消订阅,添加订阅方法
**/
public interface Observer {
//更新操作
public void update(String message);
//订阅操作
public void additive(Observableimpl observaleimpl);
//取消订阅操作
public void exit(Observer user);
public void setObservable(Observableimpl observableimpl);
}
观察者实现类:
package observer;
/**
* @author F3ver1
* @date 2019/4/21 8:04
*/
public class User implements Observer {
private Observableimpl observableimpl;
private String name;
private String message;
public User(String name) {
this.name = name;
}
@Override
public void setObservable(Observableimpl observableimpl) {
this.observableimpl = observableimpl;
}
public Observableimpl getObservable() {
return observableimpl;
}
@Override
public String toString() {
return "User:"+ name+" ";
}
//订阅
@Override
public void additive(Observableimpl observableimpl) {
setObservable(observableimpl);
this.observableimpl.registerObserver(this);
}
//退订
@Override
public void exit(Observer user) {
System.out.println(name+" "+"收到这条消息退订了该公众号");
getObservable().removeObserver(user);
}
@Override
public void update(String message) {
this.message = message;
System.out.println(name+" 收到推送消息 "+message);
}
}
最后,再写一段Test测试类看看结果如何
package observer;
/**
* @author F3ver1
* @date 2019/4/21 8:17
*/
public class Test {
public static void main(String[] args) {
//创建被观察者(公众号)实例
Observableimpl wechat = new Observableimpl();
//创建观察者(订阅者)
Observer user1 = new User("Alice");
Observer user2 = new User("Bob");
Observer user3 = new User("Tom");
//订阅操作
user1.additive(wechat);
user2.additive(wechat);
user3.additive(wechat);
wechat.setMessage("Python是世界上最好的语言!!");
user1.exit(user1);
System.out.println("--------------------------------");
//Alice 执行退订操作
wechat.setMessage("不好意思,Java才是世界上最好的语言!!");
}
}
结果:
已更新信息:Python世界上最好的语言!!
Alice 收到推送消息 Python世界上最好的语言!!
Bob 收到推送消息 Python世界上最好的语言!!
Tom 收到推送消息 Python世界上最好的语言!!
Alice 收到这条消息退订了该公众号
已更新信息:不好意思,Java是世界上最好的语言!!
Bob 收到推送消息 Java是世界上最好的语言!!
Tom 收到推送消息 Java是世界上最好的语言!!