1、什么是观察者模式?
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,让他们自动更新自己。
举个例子:在java GUI程序中,一个按钮有多个监听器,当这个按钮被点击时,即上面所说的主题对象状态发生变化,多个监听器自动得到调用。
2、观察者模式的组成:可以概括为两个抽象和两个具体。
-
抽象主题(Subject)角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。
-
抽象观察者(Observer)角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
-
具体主题角(ConcreteSubject)色:在具体主题角色内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常由一个子类来实现。
-
具体观察者(ConcreteObserver)角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。通常用一个子类来实现。
上面说的还是很抽象,还是用代码来说话吧!
代码如下:
//抽象主题角色:
//抽象主题角色
public interface Subject
{
//注册观察者对象
public void addWatcher(Observer watcher);
//删除观察者对象
public void removeWatcher(Observer watcher);
//通知所有的观察者对象
public void notifyWatchers(String str);
}
//具体主题角色:
//具体主题角色
public class ConcreteSubject implements Subject
{
//把所有对观察者对象的引用保存在一个集合中
private List<Observer> list = new ArrayList<Observer>();
@Override
public void addWatcher(Observer watcher)
{
list.add(watcher);
}
@Override
public void removeWatcher(Observer watcher)
{
list.remove(watcher);
}
@Override
public void notifyWatchers(String str)
{
for(Observer watcher : list)
{
watcher.update(str);
}
}
}
//抽象观察者角色:
//抽象观察者角色
public interface Observer
{
public void update(String str);
}
//具体观察者对象:
//具体观察者对象
public class ConcreteObserver implements Observer
{
@Override
public void update(String str)
{
System.out.println(str);
}
}
//测试类:
public class TestObserver
{
public static void main(String[] args)
{
//相当于GUI中一个按钮
Subject watched = new ConcreteSubject();
//相当于按钮的事件监听器
Observer watcher1 = new ConcreteObserver();
Observer watcher2 = new ConcreteObserver();
Observer watcher3 = new ConcreteObserver();
//将监听器注册到主题角色中
watched.addWatcher(watcher1);
watched.addWatcher(watcher2);
watched.addWatcher(watcher3);
//在单击按钮后,触发了事件
watched.notifyWatchers("hello");
System.out.println("-----------");
watched.removeWatcher(watcher1);
watched.notifyWatchers("world");
}
}
3、总结:java在GUI编程中大量使用了观察者模式,在jdk中也提供了对观察者模式的支持,它们在java.util包中的Obserable类和Observer接口,其中的实现思路与上面的代码大体相同,所以在理解了上面简单代码的基础上,再去研究jdk对观察者模式所提供的源码就不是什么难事了。
分享到:
相关推荐
我们可以学习到如何使用接口、抽象类以及设计模式(如工厂模式、观察者模式)来组织代码。 在Doughnut-master文件夹中,我们可以找到项目的所有源代码、资源文件和构建脚本。分析源码时,建议按照以下步骤进行: 1...
例如,可以使用工厂模式来创建不同类型的飞机和子弹,策略模式来定义不同的敌机行为,观察者模式来处理游戏状态的变化通知等。 总的来说,“飞机大战Java源代码”是一个很好的学习资源,它涵盖了基础的Java GUI编程...
- 实现暂停、播放、快进和回放功能,以便观察不同阶段的模式。 5. **生命游戏的模式**: - 介绍几种经典的生命游戏模式,如滑翔者、枪炮、复制器和振荡器,以及它们如何产生和影响周围的细胞。 - 分析这些模式...
1. 观察者模式的合理使用:LiveData或Observable等观察者模式的正确配置,能有效避免内存泄漏。 2. 分层的明确界定:确保Model、View和ViewModel各司其职,避免相互污染。 3. 模块化设计:将复杂的业务逻辑拆分为多...
这种模式符合观察者设计模式,但RxJava提供了更强大的功能,如延迟计算、背压控制等。 接下来,我们来看几个关键的操作符,它们是RxJava强大功能的体现: 1. `map()`:这个操作符允许我们将Observable发出的每一项...
这种设计模式使得代码更加模块化,易于测试和维护。 1. **创建Observable**: 在RxAndroid中,你可以使用各种静态工厂方法创建Observable,比如`Observable.just()`、`Observable.from()`、`Observable.create()`...
12. **设计模式**:初探常见的设计模式,如工厂模式、单例模式、观察者模式,以及它们在实际项目中的应用。 13. **单元测试**:学习JUnit框架,了解如何编写和执行单元测试,确保代码的质量。 14. **Maven或Gradle...
- **3.1.2.5 运行**:启动服务器端程序,然后启动客户端程序,观察结果。 - **3.1.3 Java实现**:类似于C++实现,但使用Java语言编写。 #### 四、ICE应用开发基础 **4.1 本章目的** 介绍了如何将Slice文件映射到...
此外,可能还运用了设计模式,如工厂模式、观察者模式等,以提高代码的复用性和灵活性。版本控制工具如Git也可能会被用来协同开发和管理代码。 总的来说,LiFuLong系统通过Java技术栈实现了生鲜农产品运输的智能化...
4. **容错与扩展性**: Jmesa设计时考虑了分布式系统的容错性和可扩展性,可以在多节点环境中运行,保证服务的高可用性。 5. **API友好**: 提供简单易用的Java API,便于开发者集成到现有的应用程序中。 **初探...
6. `Activity/Fragment`:用户界面部分,通过观察ViewModel的观察者模式来实时更新UI。 五、实战演练 在实际运行"NetworkingDemo"时,开发者可以通过调试工具查看网络请求的细节,了解Retrofit和OkHttp如何协作...