`

设计模式学习笔记——观察者模式

阅读更多

观察者模式

又叫发布-订阅模式 源-监听器模式 从属模式等等

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主体对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

 

观察者模式中有以下这些角色:

Subject抽象主题角色:主题角色将所有的观察者对象的引用保存在一个聚集里,提供增删的接口。

Observer抽象观察者角色:为所有观察者提供统一接口,在得到通知时更新自己。

ConcreteSubject具体主题角色:实现抽象主题Subject中定义的方法 包括维护一个聚合 通知其中的观察者等

ConcreteObserver抽象观察者:实现更新自己的方法 更具具体需要实现自身逻辑。

免责盗图:

具体代码实现

首先Subject抽象主题:

public interface Subject {
	void addObserver(Observer observer);
	void delObserver(Observer observer);
	void notifyObserver();
	void change();
}

 其中定义了主题类会用到的关于维护和通知observer聚合的方法

同样的Observer抽象观察者,其中只定义了一个update方法

public interface Observer {
	void update();
}

 而在具体实现操作的ConcreteObserver中,为了方便观察,我们让update方法答应出一句话

public class ConcreteObserver implements Observer{
	private String observerName;
	public ConcreteObserver(String name){
		this.observerName=name;
	}
	public void update() {
		System.out.println(observerName+" is notifyed");
	}
}

 ConcreteSubject的实现:

public class ConcreteSubject implements Subject{
	private Vector subjectVector=new Vector();
	public void addObserver(Observer observer) {
		subjectVector.addElement(observer);
	}

	public void delObserver(Observer observer) {
		subjectVector.removeElement(observer);
	}

	public void notifyObserver() {
		int s=subjectVector.size();
		for(int i=0;i<s;i++){
			((Observer)subjectVector.get(i)).update();
		}
	}
	
	public void change(){
		notifyObserver();
	}
}

 通过一个Vector来维护observer列表,并提供了add和del方法,用于绑定或撤销绑定。

实现的效果:

public class ObserverPattern {
	public static void main(String[] args){
		ConcreteSubject subject=new ConcreteSubject();
		ConcreteObserver observer1=new ConcreteObserver("observer1");		
		ConcreteObserver observer2=new ConcreteObserver("observer2");
		subject.addObserver(observer1);
		subject.addObserver(observer2);
		subject.change();
	}
}

 构件了2个observer,绑定到subject后,调用change方法表示subject状态的改变,最后输出结果

observer1 is notifyed

observer2 is notifyed

 

在Subject主题角色中,可继续加入诸如change标志位,记录subject状态的改变,这个可以参考Java提供的对观察者模式的支持

在Java中提供了java.uttl.Observable和java.util.Observer类提供观察者模式的支持

其中Observable在上面简单的例子上,添加了setChanged,clearChanged,hasChanged,countObserver等方法

其中Observable也就是上述的Subject,而Observer也和上述的Observer等同。

 

观察者模式的效果有以下的优点: 

1 观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。如果被观察者和观察者都被扔到一起,那么这个对象必然跨越抽象化和具体化层次。 

2 观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知, 

 

观察者模式有下面的缺点: 

1 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 

2 如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察者模式是要特别注意这一点。 

4 虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。 

 

观察者模式应用非常广泛,最常见的在UI中,各种Listener就是观察者模式的一种,通过setListener将动作绑定到某个控件中,而当控件状态改变(被点击或是获得焦点等),会触发相应的Listener,从而执行应该有的动作。

  • 大小: 5.5 KB
分享到:
评论

相关推荐

    学习笔记——资料

    - **常见设计模式**:单例、工厂、装饰器、代理、观察者等23种设计模式的原理和应用实例。 10. **Java进阶** - **反射机制**:允许在运行时动态获取类的信息并调用方法。 - **注解(Annotation)**:为代码添加...

    Java学习笔记——良葛格

    【Java学习笔记——良葛格】是一份由爱好者良葛格整理的Java学习资料,主要以PDF格式呈现,虽然可能不完整,但包含了丰富的Java编程基础知识和实践技巧,旨在为初学者提供一个学习和参考的平台。以下是笔记中可能...

    个人学习的java笔记——思维导图

    12. **设计模式**:设计模式是解决常见软件设计问题的经验总结,如单例模式、工厂模式、观察者模式等,熟练掌握设计模式可以提高代码质量和可维护性。 13. **框架应用**:Spring、MyBatis、Hibernate等框架极大地...

    HeadFirst设计模式笔记

    行为型模式则关注对象之间的交互,例如观察者模式(Observer)、策略模式(Strategy)和模板方法模式(Template Method)。 `PizzaIngredientFactory`是一个很好的工厂模式示例,它展示了如何利用工厂模式来创建...

    Java入门学习笔记

    设计模式是解决常见编程问题的模板,如单例模式、工厂模式和观察者模式。最后,笔记可能会介绍Java标准库的一些重要部分,如JDBC(Java数据库连接)用于数据库操作,或者Swing和JavaFX用于构建图形用户界面。 每道...

    java设计模式(收集整理,学习笔记)

    Java设计模式是软件开发中的一种重要思想,它是一种在特定情境下解决常见问题的模板,可以提高代码的可重用性、可维护性和灵活性。在Java中,设计模式主要分为三大类:创建型、结构型和行为型。下面将详细讨论在给定...

    系统分析与设计——课程笔记.rar

    本课程笔记主要涵盖了这一领域的核心概念、方法和技术,旨在帮助学习者深入理解如何有效地进行系统分析与设计。 一、系统分析 系统分析是识别和理解业务需求的过程,为系统的开发提供基础。它包括以下步骤: 1. ...

    UML学习资料(内附三本电子书和学习笔记)

    此文档可能详细阐述了23种常见的设计模式,如工厂模式、单例模式、观察者模式等,并用UML类图进行可视化展示。UML类图是描述类、接口、协作关系及其属性和操作的一种静态视图,对于理解设计模式的结构和实现至关重要...

    软件设计师软考笔记.zip

    3. **行为型模式**:责任链模式、命令模式、解释器模式、迭代器模式、访问者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式,这些模式主要涉及对象之间的交互和行为。 通过学习和...

    c++程序设计教程——设计思想与实现(课件)

    8. **设计模式**:C++的课件可能还会涉及常见的设计模式,如工厂模式、单例模式、观察者模式等,这些模式在实际开发中非常有用。 9. **调试与性能优化**:学习如何利用调试工具找出并修复程序中的错误,以及如何...

    Android学习笔记(十六)——碎片之间进行交互(附源码)

    5. **LiveData和ViewModel**:在Android架构组件中,LiveData和ViewModel提供了观察者模式的实现,允许碎片之间实时同步数据。一个碎片修改了ViewModel中的数据,其他观察了相同ViewModel的碎片会自动收到通知并更新...

    软件体系结构——课程笔记.rar

    3. 观察者模式:定义对象间的一对多依赖关系,当一个对象的状态改变时,所有依赖它的对象都会得到通知并自动更新。 4. 适配器模式:使不兼容的接口能够协同工作。 四、评估与选择架构 评估软件架构通常基于以下标准...

    期末考试复习做的笔记,包括:操作系统,设计模式,计算机网络,算法设计与分析.zip

    例如,单例模式确保一个类只有一个实例,工厂模式提供了一种创建对象的最佳方式,而观察者模式允许对象之间建立一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。...

    java学习笔记

    ### Java学习笔记知识点详解 #### 一、Java面向对象编程思想 面向对象编程(Object-Oriented Programming, OOP)是Java的核心特性之一。通过封装、继承和多态这三个基本特征来实现。OOP能够提高代码的复用性和可...

    MFC 框架原理学习笔记

    MFC的设计遵循了设计模式中的许多原则,如单例模式(Singleton)、工厂模式(Factory)和观察者模式(Observer)。 **文档/视图架构** MFC中的核心设计是文档/视图(Document/View)架构,这是一种分离数据(文档)...

    安卓Android源码——坦克大战游戏源码.zip

    开发者可能使用了面向对象的设计模式,如工厂模式创建坦克和子弹,观察者模式处理事件,状态模式管理游戏的不同阶段。 2. 图形绘制:坦克、背景、子弹等元素的绘制通常在SurfaceView的onDraw()方法中进行。开发者...

    dotnet 读 WPF 源代码笔记 AppDomainShutdownMonitor 的设计.rar

    5. **设计模式**:在WPF源代码中,AppDomainShutdownMonitor可能采用了诸如观察者模式、工厂模式或者装饰器模式等设计模式来实现其功能。熟悉这些模式有助于理解其代码结构和意图。 6. **OpenXML**:虽然标签中提到...

    Java_Architect_Notes-John_H.rar_architect_java architect

    2. **设计模式与重构**:设计模式是解决软件设计中常见问题的最佳实践,如工厂模式、单例模式、观察者模式等。重构则是改善代码结构,提高可读性和可维护性的重要手段。学习如何在实际项目中应用这些模式,能提升...

    read:学习笔记dubbo,spring,mybatis,netty源码解析-源码解析

    设计模式是软件工程的最佳实践,如单例模式、工厂模式、观察者模式等,理解并能灵活运用这些模式可以提高代码的可维护性和扩展性。而算法是解决问题的关键,无论是数据结构还是排序算法,都是提升程序效率的重要工具...

    遇见狂神说的全套java视频笔记

    12. **设计模式**:设计模式是解决常见软件设计问题的成熟解决方案,如单例模式、工厂模式、观察者模式等,它们在Java开发中被广泛应用。 “狂神说全部笔记内容”可能详细地解析了以上各个知识点,并通过实例和练习...

Global site tag (gtag.js) - Google Analytics