java提供了Observer接口和Observable类,可以很容易实现一个对象对另一个对象的观察。但同时也存在一些问题,至少个人是这么认为的:
- observer对observable的观察行为是由前者发出,而原生java中的这种关系是由Observable的addObserver方法来建立的。虽然观察者模型中大概就是这么描述的,但总感觉有些别扭。比如我要看一个美女,总不能由她来确定我是否可以观察她吧。
- 原生的被观察者需要继承Observable类,但是被观察者也需要继承其他类时就会出现冲突。如果把Observable实例作为一个属性,因为setChange方法是protect无法调用,会导致notifyObservers方法执行失败。当然总有解决办法,这个不得不说是一个问题。
- 在observer和observable建立关系后,需要observer的update方法来响应observable的行为。update方法有两个参数Observable o, Object arg,当observable存在多个不同场合触发动作时,observer只能通过第二个参数来判断动作类型以做响应,不太方便。
为了解决以上问题,基于Observer接口和Observable类实现了一套观察者模式的代码。先贴一下使用方法:
- 被观察者。需要定义一个observable属性,用以执行Observable职责。
package com.hulkdeng.test;
import com.hulkdeng.observe.Observable;
import com.hulkdeng.observe.Observables;
import java.util.HashMap;
import java.util.Map;
public class ObservableDemo {
private Observable observable;
public ObservableDemo() {
//注册可名为hulk的可观察对象
observable = Observables.register("hulk", this);
}
public void smash() {
Map<String, Object> props = new HashMap<String, Object>();
//为事件添加属性
props.put("power", 100000);
//触发名为smash的事件,并携带props参数
observable.fire("smash", props);
}
}
- 观察者。同样需要定义一个observer属性,用以执行Observer职责。
package com.hulkdeng.test;
import com.hulkdeng.observe.*;
//观察者需要实现ObserveSupport接口
public class ObserverDemo implements ObserverSupport {
private Observer observer;
public ObserverDemo() {
//注册观察者
observer = Observers.register(this);
//观察名为hulk的对象
observer.observe("hulk");
}
@Override
public void update(Event event) {
//sourceName为被观察者的注册名(hulk),eventName是当前事件名称(smash)
String sourceName = event.getSourceName(), eventName = event.getEventName();
//获取事件的属性
Integer power = event.getProp("power");
//获取被观察对象
ObservableDemo observableDemo = Observables.getSource("hulk");
}
}
以下依次介绍所使用的代码:
- Event类。封装了被观察者信息及自定义属性,用以替换原版中的notifyObservers方法中第二个参数Object arg。
package com.hulkdeng.observe;
import java.util.Map;
public class Event {
private String sourceName;
private String eventName;
private Map<String, Object> props;
public Event(String sourceName, String eventName) {
this.sourceName = sourceName;
this.eventName = eventName;
}
public Event(String sourceName, String eventName, Map<String, Object> props) {
this.sourceName = sourceName;
this.eventName = eventName;
this.props = props;
}
public String getSourceName() {
return sourceName;
}
public String getEventName() {
return eventName;
}
public <T> T getProp(String key) {
return props != null ? (T) props.get(key) : null;
}
}
- Observable接口。专门用于触发操作的接口。
package com.hulkdeng.observe;
import java.util.Map;
public interface Observable {
void fire(String name);
void fire(String name, Map<String, Object> props);
}
- Observables类。用于集中管理被观察者的,其中包含ObservableBridge内部类,扩展优化了原始Observable并实现了上边的Observable接口。
package com.hulkdeng.observe;
import java.util.HashMap;
import java.util.Map;
public class Observables {
private static Map<String, ObservableBridge> observableObjects = new HashMap<String, ObservableBridge>();
public static Observable register(String name, Object source) {
ObservableBridge bridge = new ObservableBridge(name, source);
observableObjects.put(name, bridge);
return bridge;
}
public static java.util.Observable get(String name) {
return observableObjects.get(name);
}
public static <T> T getSource(String name) {
return (T) observableObjects.get(name).getSource();
}
public static boolean contains(String name) {
return observableObjects.containsKey(name);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public static class ObservableBridge extends java.util.Observable implements Observable {
private String sourceName;
private Object source;
private ObservableBridge(String sourceName, Object source) {
this.sourceName = sourceName;
this.source = source;
}
public String getSourceName() {
return sourceName;
}
public Object getSource() {
return source;
}
@Override
public void fire(String name) {
setChanged();
notifyObservers(new Event(sourceName, name));
}
@Override
public void fire(String name, Map<String, Object> props) {
setChanged();
notifyObservers(new Event(sourceName, name, props));
}
}
}
- Obsever类。专门用于执行observe操作的一个中间类。
package com.hulkdeng.observe;
public class Observer {
private Observers.ObserverBridge observerBridge;
public Observer(ObserverSupport observer) {
this.observerBridge = new Observers.ObserverBridge(observer);
}
public void observe(String name) {
if (Observables.contains(name)) {
Observables.get(name).addObserver(observerBridge);
}
}
}
- Obsevers类。结合上边的Obsever类及其内部类ObseverBridge实现了观察者observe方法和update方法的分离和扩展。
package com.hulkdeng.observe;
import java.util.Observable;
public class Observers {
public static Observer register(ObserverSupport observer) {
return new Observer(observer);
}
public static class ObserverBridge implements java.util.Observer {
private ObserverSupport observer;
public ObserverBridge(ObserverSupport observer) {
this.observer = observer;
}
/**
* This method is called whenever the observed object is changed. An
* application calls an <tt>Observable</tt> object's
* <code>notifyObservers</code> method to have all the object's
* observers notified of the change.
*
* @param o the observable object.
* @param arg an argument passed to the <code>notifyObservers</code>
*/
@Override
public void update(Observable o, Object arg) {
observer.update((Event) arg);
}
}
}
- ObseverSupport接口。专门执行观察者update方法的接口。
package com.hulkdeng.observe;
public interface ObserverSupport {
void update(Event event);
}
以上代码都是用于个人项目,没有经过大规模验证,纯粹是为实现个人思想而作,还有很多纰漏。仅供大家参考娱乐
分享到:
相关推荐
观察者模式在Java中得到了很好的支持,`java.util.Observable`和`java.util.Observer`是Java标准库提供的观察者模式实现。开发者可以方便地利用这两个类实现观察者模式,也可以根据实际需求自定义观察者接口和主题类...
在IT行业中,通知机制是一种广泛应用于软件开发中的通信方式,特别是在多线程环境或模块化...通过学习和理解这个项目,开发者可以更好地掌握这一重要的软件设计模式,从而在自己的项目中实现更高效、更灵活的组件通信。
1. **Observable(可观察者)**:作为事件的发布者,负责产生事件。 2. **Observer(观察者)**:作为事件的订阅者,接收并处理事件。 3. **Subscription(订阅)**:连接观察者和可观察者,管理订阅关系。 4. **...
EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现。对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案,我们不用创建复杂的类和接口层次结构。 ...
RXJava的核心是Observable(可观察者)和Observer(观察者)。Observable可以发布数据,而Observer则订阅这些数据并作出响应。RXJava提供了一系列的操作符,如map、filter、concatMap等,用于在数据流上进行变换和...
RxJava是一种在Java VM上使用可观察的序列来组成异步的、基于观察者的程序的库。它将事件、值甚至是资源都视为一系列的数据流,并提供了操作这些数据流的能力。RxJava的核心特性包括对响应式编程的支持、异步数据流...
RxJava的核心概念包括Observable(可观察者)和Observer(观察者)。Observable负责生成数据,而Observer则订阅这些数据并进行处理。通过使用各种操作符,如map、filter、concatMap等,开发者可以方便地对数据流进行...
- **Observer**:观察者,负责接收来自Observable的数据。 - **Subscription**:订阅关系,连接Observer和Observable。 - **Subject**:既是Observable也是Observer的特殊对象,可以同时发送和接收数据。 - **...
2. **Observer**: 观察者,订阅Observable并接收数据流中的值。 3. **Subscription**: 订阅关系,连接Observer与Observable,允许取消订阅。 4. **Schedulers**: 调度器,用于控制Observable何时何地执行。 #### 四...
RxJava则是处理异步操作的强大工具,它基于响应式编程的理念,提供了Observable(可观察者)和Observer(观察者)的概念,可以方便地处理复杂的事件流。在MVP模式下,Presenter通常会订阅Observables,当数据发生...
- **Subscription(订阅)**:连接Observable和Observer之间的桥梁,通过订阅机制,观察者可以监听Observable发出的数据流。 #### 实战应用案例 - **数据绑定**:RxSwift可以用于实现视图与模型之间的自动数据绑定...
RxJava 是一个在 Java VM 上使用可观测的序列来组成异步或基于事件的程序的库。...同时,不同类型的观察者模式适应了不同的数据传输需求,使得在处理各种复杂逻辑时,可以更精准地选择合适的方法。
在这个项目中,RXSwift被用来处理登录过程中的各种事件,如用户输入、网络请求的响应等,通过创建观察者(Observer)和可观察序列(Observable),可以实现异步操作的同步化管理,减少回调地狱,提升代码的可读性...
在2.x版本中,RxJava引入了更多优化,提高了性能和易用性。本文将深入探讨如何集成RxJava2.x到你的项目中,并通过实际示例来展示其核心概念和使用方法。 ### 1. 添加依赖 在集成RxJava2.x之前,首先需要在你的项目...
RxJava的核心概念是Observable(可观察者)和Observer(观察者),它们之间通过订阅关系进行通信。在MyWeather应用中,RxJava可以用来管理网络请求的生命周期,比如在请求完成或出错时通知UI。 3. **Realm**: ...
在Android开发中,RxJava是一个广泛使用的库,它允许开发者处理异步操作、事件处理和数据流管理,通过Observables(观察者)和Operators(操作符)来构建复杂的逻辑。 RxSimpleNoSQL的核心特性包括: 1. **异步...
1. **RxJava2基本概念**:包括Observable(可观察者)、Observer(观察者)、subscribe(订阅)以及各种操作符,如map、filter、concatMap、flatMap、zip等。 2. **在Android中的应用**:如何在Activity或Fragment...
- **异步操作**:利用RXJava2的 Observable 和 Observer 来实现异步数据库操作,确保UI不被阻塞。 5. **最佳实践**: - **数据库版本管理**:在数据库升级时,应正确处理版本迁移,以确保数据的一致性和完整性。 ...
RxJava通过Observable(可观察者)和Observer(观察者)的概念,使得事件处理变得更加灵活。在Android开发中,它可以用来管理异步任务、处理复杂的逻辑流,以及减少回调地狱。 4. **Retrofit2**: 是Square公司开发...