搜索热词

23种设计模式第十三篇:java观察者模式

定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

类型:行为类模式

类图:

在软件系统中经常会有这样的需求:如果一个对象的状态发生改变,某些与它相关的对象也要随之做出相应的变化。

比如,我们要设计一个右键菜单的功能,只要在软件的有效区域内点击鼠标右键,就会弹出一个菜单;

再比如,我们要设计一个自动部署的功能,就像eclipse开发时,只要修改了文件,eclipse就会自动将修改的文件部署到服务器中。

这两个功能有一个相似的地方,那就是一个对象要时刻监听着另一个对象,只要它的状态一发生改变,自己随之要做出相应的行动。其实,能够实现这一点的方案很多,但是,无疑使用观察者模式是一个主流的选择。

观察者模式的结构

在最基础的观察者模式中,包括以下四个角色:

被观察者:从类图中可以看到,类中有一个用来存放观察者对象的Vector容器(之所以使用Vector而不使用List,是因为多

线程操作时,Vector在是安全的,而List则是不安全的),这个Vector容器是被观察者类的核心,另外还有三个方法:attach方法是向这个容器中添加观察者对象;detach方法是从容器中移除观察者对象;notify方法是依次调用观察者对象的对应方法。这个角色可以是接口,也可以是抽象类或者具体的类,因为很多情况下会与其他的模式混用,所以使用抽象类的情况比较多。

观察者:观察者角色一般是一个接口,它只有一个update方法,在被观察者状态发生变化时,这个方法就会被触发调用。

具体的被观察者:使用这个角色是为了便于扩展,可以在此角色中定义具体的业务逻辑。

具体的观察者:观察者接口的具体实现,在这个角色中,将定义被观察者对象状态发生变化时所要处理的逻辑。

观察者模式代码实现

public abstract class Subject {

private Vector obs = new Vector();

public void addObserver(Observer obs){

this.obs.add(obs);

}

public void delObserver(Observer obs){

this.obs.remove(obs);

}

protected void notifyObserver(){

for(Observer o: obs){

o.update();

}

}

public abstract void doSomething();

}

public class ConcreteSubject extends Subject {

public void doSomething(){

System.out.println("被观察者事件反生");

this.notifyObserver();

}

}

public interface Observer {

public void update();

}

public class ConcreteObserver1 implements Observer {

public void update() {

System.out.println("观察者1收到信息,并进行处理。");

}

}

public class ConcreteObserver2 implements Observer {

public void update() {

System.out.println("观察者2收到信息,并进行处理。");

}

}

public class Client {

public static void main(String[] args){

Subject sub = new ConcreteSubject();

sub.addObserver(new ConcreteObserver1()); //添加观察者1

sub.addObserver(new ConcreteObserver2()); //添加观察者2

sub.doSomething();

}

}

运行结果

被观察者事件反生

观察者1收到信息,并进行处理。

观察者2收到信息,并进行处理。

通过运行结果可以看到,我们只调用了Subject的方法,但同时两个观察者的相关方法都被同时调用了。仔细看一下代码,其实很简单,无非就是在Subject类中关联一下Observer类,并且在doSomething方法中遍历一下Observer的update方法就行了。

观察者模式的优点

观察者与被观察者之间是属于轻度的关联关系,并且是抽象耦合的,这样,对于两者来说都比较容易进行扩展。

观察者模式是一种常用的触发机制,它形成一条触发链,依次对各个观察者的方法进行处理。但同时,这也算是观察者模式一个缺点,由于是链式触发,当观察者比较多的时候,性能问题是比较令人担忧的。并且,在链式结构中,比较容易出现循环引用的错误,造成系统假死。

总结

java语言中,有一个接口Observer,以及它的实现类Observable,对观察者角色常进行了实现。我们可以在jdk的api文档具体查看这两个类的使用方法。

做过VC++、javascript DOM或者AWT开发的朋友都对它们的事件处理感到神奇,了解了观察者模式,就对事件处理机制的原理有了一定的了解了。如果要设计一个事件触发处理机制的功能,使用观察者模式是一个不错的选择,AWT中的事件处理DEM(委派事件模型Delegation Event Model)就是使用观察者模式实现的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

相关文章

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

设计模式java23 观察者_23种设计模式(13)java观察者模式相关推荐

  1. JAVA设计模式总结之23种设计模式(重点!!!)

    JAVA设计模式总结之23种设计模式: 一.什么是设计模式 设计模式遵循的原则有6个: 二.设计模式的三个分类 三.各分类中模式的关键点 四.概说23种设计模式 1.单例模式(Singleton) 2 ...

  2. 设计模式大杂烩(24种设计模式的总结及学习设计模式的几点建议)

    设计模式大杂烩(24种设计模式的总结及学习设计模式的几点建议)模式分类 & 传送门 & 对比维度说明 设计原则: 设计模式(总纲) 创建型: 单例模式 简单工厂模式 工厂方法模式 抽象 ...

  3. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  4. Java两种设计模式_23种设计模式(11)java策略模式

    23种设计模式第四篇:java策略模式 定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 类图: 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这 ...

  5. JAVA设计模式总结之23种设计模式

    一.什么是设计模式                                                                                           ...

  6. [转自左潇龙的博客]设计模式大杂烩(24种设计模式的总结以及学习设计模式的几点建议)...

    原文地址:    https://www.cnblogs.com/zuoxiaolong/p/pattern26.html 作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本 ...

  7. 设计模式概述以及 23种设计模式的介绍

    文章目录 设计模式概述(Design pattern): 设计模式3大类 设计模式的七大原则 设计模式概述(Design pattern): 设计模式:代表了最佳的实践,通常被有经验的面向对象的软件开 ...

  8. 设计模式概述 以及 23种设计模式的介绍

    设计模式概述(Design pattern): 设计模式:代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众 ...

  9. 五分钟精通设计模式(一)--速记23种设计模式

    本文由程序员伟哥原创,若需要转载,请注明出处. 通过我杜撰的一个新白娘子传奇故事帮助大家记忆23种设计模式 三类设计模式: 三类设计模式可以这么记: 一.白素贞闯入人满为患的大街上(闯街--创建) 刚 ...

  10. Java代码设计模式讲解二十三种设计模式

    设计模式 文章目录 设计模式 一.创造型设计模式 1.1 单例模式 1.1.1 饿汉式单例模式 1.1.2 懒汉式单例模式 (1)线程不安全的情况 (2)线程安全的情况 1. 实例化的方法上加sync ...

最新文章

  1. 2022-2028年全球与中国闪光棉市场研究及前瞻分析报告
  2. Spring Boot中自带的这些工具类,你用过几个?
  3. python3.7 6如何安装-redhat7.6 安装Python 3
  4. QT之Quick学习笔记之一(Hello Qquick)
  5. 玲珑杯 ACM Round #10
  6. Eclipse中设置在创建新类时自动生成注释的方法
  7. java运算符 —(9)
  8. windows7系统适合哪个python_Python3.6.4在Windows7系统下安装配置教程
  9. angularjs绑定属性_AngularJS隔离范围属性绑定教程
  10. 10个免费的PHP编辑器/开发工具
  11. jQuery -- 光阴似箭(三):jQuery 操作 HTML 元素和属性
  12. java中的包装类和基本类型_java中基本类型和包装类型实践经验
  13. CAD定数等分不显示等分点
  14. 微信公众号接入H5支付
  15. 杭电AI学霸班:考研上岸3清北8浙大,还没毕业年薪拿百万
  16. Windows中的未处理异常
  17. 浅谈StrictMode
  18. Error response from daemon: unable to find user ubuntu: no matching entries in passwd file
  19. clearcase命令指南
  20. 机器学习已迫在眉睫——李烨

热门文章

  1. Ros安装过程及sudo rosdep init失败解决方法
  2. android连mysql注册界面代码_Android实现注册登录界面的实例代码
  3. 蔡工RK系列Android驱动开发入门视频课程
  4. 20190528论文笔记
  5. Eclipse开启或取消快速导航栏(toggle breadcrumb)
  6. 随笔 --- 深夜反思、重定向
  7. 转iOS 多线程 RunLoop 机制 (三)
  8. JS关于辅助函数inherit()的小问题
  9. 游戏筑基开发之C语言回调函数使用实例及其.h库封装实例
  10. Security+ 学习笔记18 密码分析攻击