观察者模式——定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
观察者模式是说,当一个对象的状态发生改变的时候,关心这个对象的所有对象都会接到通知,并作出相应的反应。比如,公司的OA系统提供了消息订阅功能,当有新的消息产生时,所有订阅了该消息的员工都会接到通知,这就是观察者模式。
观察者模式的核心是一个主题接口,一个观察者接口,任何实现了主题接口的实现类都可以被观察者订阅(如会议通知、项目动态都可以被员工订阅),任何实现了观察者接口的实现类都可以订阅、或取消订阅一个主题(如中层员工订阅了会议通知、基础员工订阅了项目动态)。
主题接口:
public interface Subject { //注册一个观察者 public void registerObserver(Observer o); //移除一个观察者 public void removeObserver(Observer o); //通知所有观察者 public void notifyObservers(); }
观察者接口:
public interface Observer { //观察者作出反应 public void update(); }
一个消息主题(主题接口的实现类),主题记录了所有的观察者列表和主题的状态,当主题的状态发生改变时,可以通知所有订阅者做出相应的反应:
import java.util.ArrayList; public class MsgSubject implements Subject { private ArrayList<Observer> observers;//观察者列表 private String msg;//消息(状态) public MsgSubject(){ this.observers = new ArrayList<Observer>(); } @Override public void registerObserver(Observer o) { observers.add(o); } @Override public void removeObserver(Observer o) { int i = observers.indexOf(o); if (i >= 0) { observers.remove(i); } } @Override public void notifyObservers() { for (Observer o : this.observers) { o.update(); } } //获取主题状态的方法 public String getMsg() { return msg; } //设置主题状态的方法 public void setMsg(String msg) { this.msg = msg; } }
观察者1:
public class Observer1 implements Observer { private MsgSubject msgSubject;//记录主题的引用,当主题状态发生变化时,可向主题获取状态信息 public Observer1(MsgSubject msgSubject){ this.msgSubject = msgSubject; msgSubject.registerObserver(this);//向主题注册此观察者 } @Override public void update() { System.out.println("Observer1收到通知:" + this.msgSubject.getMsg()); } }
观察者2:
public class Observer2 implements Observer { private MsgSubject msgSubject;//记录主题的引用,当主题状态发生变化时,可向主题获取状态信息 public Observer2(MsgSubject msgSubject){ this.msgSubject = msgSubject; msgSubject.registerObserver(this);//向主题注册此观察者 } @Override public void update() { System.out.println("Observer2收到通知:" + this.msgSubject.getMsg()); } }
测试类:
public class Test { /** * 观察者模式——定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 * * 主题接口的实现类记录了所有的观察者列表和主题的状态,可以向一个主题注册或取消注册一个观察者, * 当主题的状态发生改变时,可以通知所有订阅者做出相应的反应 * @param args */ public static void main(String[] args) { MsgSubject msgSubject = new MsgSubject(); Observer1 o1 = new Observer1(msgSubject); Observer2 o2 = new Observer2(msgSubject); msgSubject.setMsg("第一条消息");//改变主题状态 msgSubject.notifyObservers();//通知所有观察者作出反应 msgSubject.setMsg("第二条消息");//改变主题状态 msgSubject.notifyObservers();//通知所有观察者作出反应 msgSubject.removeObserver(o1);//观察者1取消订阅 msgSubject.setMsg("第三条消息");//改变主题状态 msgSubject.notifyObservers();//通知所有观察者作出反应 } }
相关推荐
【Java学习笔记——良葛格】是一份由爱好者良葛格整理的Java学习资料,主要以PDF格式呈现,虽然可能不完整,但包含了丰富的Java编程基础知识和实践技巧,旨在为初学者提供一个学习和参考的平台。以下是笔记中可能...
设计模式是解决常见编程问题的模板,如单例模式、工厂模式和观察者模式。最后,笔记可能会介绍Java标准库的一些重要部分,如JDBC(Java数据库连接)用于数据库操作,或者Swing和JavaFX用于构建图形用户界面。 每道...
【Java学习笔记——全面解析】 Java作为一种广泛应用的高级编程语言,是软件开发领域的核心力量。这份"学习笔记——资料"涵盖了Java学习的各个方面,旨在帮助初学者和有经验的开发者巩固基础,提升技能。以下是对这...
12. **设计模式**:设计模式是解决常见软件设计问题的经验总结,如单例模式、工厂模式、观察者模式等,熟练掌握设计模式可以提高代码质量和可维护性。 13. **框架应用**:Spring、MyBatis、Hibernate等框架极大地...
Java设计模式是软件开发中的一种重要思想,它是一种在特定情境下解决常见问题的模板,可以提高代码的可重用性、可维护性和灵活性。在Java中,设计模式主要分为三大类:创建型、结构型和行为型。下面将详细讨论在给定...
8. **JAVA设计模式.chm**:设计模式是软件工程中的重要概念,这本书详细介绍了23种经典设计模式,如单例模式、工厂模式、观察者模式等,对提升代码质量和可维护性有极大帮助。 9. **Oracle optimizer.chm**:可能...
### Java学习笔记知识点详解 #### 一、Java面向对象编程思想 面向对象编程(Object-Oriented Programming, OOP)是Java的核心特性之一。通过封装、继承和多态这三个基本特征来实现。OOP能够提高代码的复用性和可...
15. **设计模式**:涵盖了常见的设计模式,如单例、工厂、观察者、装饰者等,以及如何在实际编程中应用这些模式。 这份文档集是学习Java编程的宝贵资源,它不仅包含理论知识,还提供了丰富的示例代码,帮助学习者...
12. **设计模式**:设计模式是解决软件设计中常见问题的模板,如单例模式、工厂模式、观察者模式等,它们是成为优秀Java开发者的重要组成部分。 这份"java笔记与java核心内容解读"将详细阐述以上知识点,通过实例和...
这份压缩包包含了博主在学习过程中记录的详细笔记,以及一份精心整理的设计模式表格,旨在帮助备考者系统、高效地掌握相关知识。 首先,我们来探讨一下“软考”——这是一项国家级的专业技术资格认证考试,旨在评测...
031114_【第11章:Java常用类库】_观察者设计模式笔记.pdf 031115_【第11章:Java常用类库】_正则表达式笔记.pdf 031116_【第11章:Java常用类库】_定时调度笔记.pdf 031201_【第12章:JAVA IO】_File类笔记.pdf ...
通过分析开源项目或Java标准库,可以了解实际应用中的最佳实践和设计模式。比如观察ArrayList和HashMap的实现,可以学习如何优化数据结构和算法。 理论与实践相结合的同时,还要注重工具的使用。IntelliJ IDEA、...
在深入Java编程时,你会接触到更多的面向对象概念,比如接口(Interface)、抽象类(Abstract Class)、访问修饰符(Public、Private、Protected、Default)、构造器(Constructor)、final关键字、static关键字、...
12. **设计模式**:设计模式是解决常见软件设计问题的成熟解决方案,如单例模式、工厂模式、观察者模式等,它们在Java开发中被广泛应用。 “狂神说全部笔记内容”可能详细地解析了以上各个知识点,并通过实例和练习...
12. **设计模式**:理解并应用常见的设计模式(如单例、工厂、观察者、装饰器等),可以提高代码的可维护性和复用性。 13. **Java EE**:对于进阶学习,了解Java企业级应用开发,如Servlet、JSP、JPA、Spring框架等...
- **设计模式**:单例、工厂、观察者等常见设计模式及其在Java中的实现。 总之,"最全的java达内笔记"应是一个全面的学习资源,不仅覆盖EJB,还可能深入到Java的各个方面,旨在帮助学习者构建扎实的Java技能,从而...
2. **设计模式与重构**:设计模式是解决软件设计中常见问题的最佳实践,如工厂模式、单例模式、观察者模式等。重构则是改善代码结构,提高可读性和可维护性的重要手段。学习如何在实际项目中应用这些模式,能提升...
5. **设计模式**:学习常见的设计模式,如工厂模式、单例模式、观察者模式、装饰者模式等,有助于写出高效、可维护的代码。 6. **反射机制**:通过反射,可以在运行时动态地获取类的信息并调用其方法,增强程序的...
11. **设计模式**:设计模式是软件设计中的一些常见解决方案,如单例模式、工厂模式、观察者模式等。学习和应用设计模式可以提高代码的可读性和可维护性。 这个"JavaLearning"压缩包可能还包含了一些练习题目和解决...
6. **设计模式**:可能讲解一些常见的设计模式,如单例模式、工厂模式、观察者模式等,这些都是提高代码可读性和可维护性的关键。 7. **JVM内部工作原理**:可能介绍垃圾收集机制、内存模型、类加载过程等,帮助...