赞
踩
观察者模式是一种行为型模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象,当主题对象状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
观察者模式可以方便地实现对象之间的松耦合,提高系统的可维护性和可扩展性。例如,当一个对象的状态发生变化时,我们可以通过观察者模式来避免紧耦合的代码,可以让多个观察者对象独立地对主题对象的状态变化做出响应。
在Android开发中,观察者模式经常用在以下场景:
1)当用户点击一个按钮时,多个控件需要同时更新显示,此时可以使用观察者模式,让这些控件成为主题对象的观察者,当主题对象的状态发生变化时,通知观察者更新自己。
2)当用户需要实时获取某个数据时,可以将该数据作为主题对象,多个观察者监听该主题对象,当该数据发生变化时,主题对象通知所有观察者对象更新自己,这样可以实现实时更新数据。
3)当用户需要实现事件总线的功能时,可以使用观察者模式,通过注册观察者来监听事件的发生,当事件发生时,通知所有观察者处理相应的逻辑。
在观察者模式中,主要包含以下几个角色:
1)抽象主题:定义了主题对象的接口,其中包含了添加、删除、通知观察者的方法。
2)具体主题:实现了抽象主题的接口,同时保存了观察者列表,并在状态发生变化时,通知所有观察者。
3)抽象观察者:定义了观察者的接口,其中包含了更新自己的方法。
4)具体观察者:实现了抽象观察者的接口,具体实现自己的更新逻辑。
以观察者模式实现事件总线为例,代码实现如下:
1、抽象主题
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(Object obj);
}
2、具体主题
public class EventBus implements Subject{ private List<Observer> observerList = new ArrayList<>(); @Override public void registerObserver(Observer observer) { observerList.add(observer); } @Override public void removeObserver(Observer observer) { observerList.remove(observer); } @Override public void notifyObservers(Object obj) { for (Observer observer : observerList) { observer.update(obj); } } }
3、抽象观察者
public interface Observer {
void update(Object obj);
}
4、具体观察者
public class MainObserver implements Observer {
public MainObserver(Subject subject) {
subject.registerObserver(this);
}
@Override
public void update(Object obj) {
//处理逻辑
}
}
5、使用示例
EventBus eventBus = new EventBus();
MainObserver mainObserver = new MainObserver(eventBus);
//事件发生时,通知所有观察者
eventBus.notifyObservers(obj);
在Android SDK中,一个经典的例子是使用观察者模式来监听网络连接状态的变化。Android提供了一个名为ConnectivityManager
的类,该类可以用来监测设备的网络连接状态。它使用了观察者模式来通知应用程序网络连接状态的变化。
下面是一个简化的示例代码,展示了如何使用ConnectivityManager
和观察者模式来监听网络连接状态的变化:
// 实现一个观察者接口 interface NetworkStatusObserver { void onNetworkStatusChanged(boolean isConnected); } // 创建具体的观察者类 class NetworkStatusObserverImpl implements NetworkStatusObserver { @Override public void onNetworkStatusChanged(boolean isConnected) { if (isConnected) { System.out.println("网络已连接"); } else { System.out.println("网络已断开"); } } } // 在Activity中使用观察者模式监听网络连接状态的变化 public class MainActivity extends AppCompatActivity { private ConnectivityManager connectivityManager; private NetworkStatusObserver observer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); observer = new NetworkStatusObserverImpl(); // 注册观察者,监听网络连接状态变化 connectivityManager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(@NonNull Network network) { observer.onNetworkStatusChanged(true); } @Override public void onLost(@NonNull Network network) { observer.onNetworkStatusChanged(false); } }); // 模拟网络连接状态变化 boolean isConnected = checkNetworkStatus(); observer.onNetworkStatusChanged(isConnected); } // 检查网络连接状态 private boolean checkNetworkStatus() { NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null && activeNetworkInfo.isConnected(); } }
在这个例子中,我们定义了一个NetworkStatusObserver
接口作为观察者,NetworkStatusObserverImpl
是具体的观察者类。在MainActivity
中,我们通过使用ConnectivityManager
来监听网络连接状态的变化。通过注册ConnectivityManager.NetworkCallback
回调接口,当网络连接状态发生变化时,会通过观察者模式通知观察者对象。NetworkStatusObserverImpl
实现onNetworkStatusChanged
方法来处理网络连接状态的变化。
这个例子展示了Android SDK中如何使用观察者模式来监听网络连接状态的变化。通过使用观察者模式,我们可以方便地将网络连接状态的变化通知给观察者,实现相应的操作。
EventBus是一个广播/订阅事件总线库,它通过观察者模式来实现事件的发布和订阅。在EventBus中,有以下几个关键角色:
- 事件:表示一个特定的动作、状态或消息。
- 发布者:负责发布事件。
- 订阅者:负责订阅感兴趣的事件。
- 观察者模式的实现:EventBus使用观察者模式来实现事件的发送和接收。
下面是一个简单的使用EventBus的示例:
public class MessageEvent {
private String message;
public MessageEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 注册订阅者 EventBus.getDefault().register(this); } // 订阅事件处理方法 @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { // 处理接收到的事件 String message = event.getMessage(); // ... } @Override protected void onDestroy() { super.onDestroy(); // 取消注册订阅者 EventBus.getDefault().unregister(this); } }
// 在需要的地方发布事件
EventBus.getDefault().post(new MessageEvent("Hello, EventBus!"));
在上述示例中,MessageEvent
表示一个事件,即包含一条消息的事件。MainActivity
作为订阅者,通过使用@Subscribe
注解的方法onMessageEvent
来处理接收到的事件。
在onCreate
方法中,我们通过调用EventBus.getDefault().register(this)
来注册订阅者。这样,在onMessageEvent
方法中对接收到的事件进行处理。
在onDestroy
方法中,我们通过调用EventBus.getDefault().unregister(this)
来取消注册订阅者,避免可能的内存泄漏。
通过调用EventBus.getDefault().post(new MessageEvent("Hello, EventBus!"))
来发布事件。
在观察者模式中,EventBus使用订阅者模式的原理,即订阅者通过注册方法将自己注册到事件总线,然后事件总线在有事件发布时通知所有已注册的订阅者。订阅者通过注解和特定的方法来接收和处理感兴趣的事件。
因此,在EventBus中,观察者模式体现在订阅者通过注册方法将自己注册到事件总线,然后在需要的地方发布事件,事件总线会将事件通知给已注册的订阅者以进行处理。
观察者模式是一种常用的设计模式,它可以实现对象之间的松耦合,提高系统的可维护性和可扩展性。在Android开发中,观察者模式经常用于实现事件总线、多控件协作等功能。通过学习观察者模式,我们可以更好的理解面向对象设计的思想和原则,提高我们的设计水平和编码能力。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。