设计模式--->观察者模式

作者:无名    it人知识库   2020-09-15 00:00:00

   观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

import java.util.Vector;
public abstract class Subject {
 private Vector<Observer> vector = new Vector<Observer>();
 public void addObservers(Observer observer){
  this.vector.add(observer);
 }
 
 public void deleteObserver(Observer observer){
  this.vector.remove(observer);
 }
 
 protected void notifyObserver(){  
        for(Observer observer: vector){  
         observer.update();  
        }  
    } 
 
 public abstract void doSomething();
 
}

 

package com.test.observer;
public class ModifySubject extends Subject {
 @Override
 public void doSomething() {
  // TODO Auto-generated method stub
  System.out.println("被观察者发生改变");
  this.notifyObserver();
 }
}
papackage com.test.observer;
public interface Observer {
 public void update();
}
package com.test.observer;
public class Observer1 implements Observer {
 @Override
 public void update() {
  // TODO Auto-generated method stub
  System.out.println( "Observer1收到消息");
 }
}
package com.test.observer;
public class Observer2 implements Observer {
 @Override
 public void update() {
  // TODO Auto-generated method stub
  System.out.println( "Observer2收到消息");
 }
}
package com.test.observer;
public class Client {
 public static void main(String[] args) {
  Subject subject = new ModifySubject();
  subject.addObservers(new Observer1());
  subject.addObservers(new Observer2());
  subject.doSomething();
 }
}

结果:

被观察者发生改变
Observer1收到消息
Observer2收到消息

观察者模式的优点

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

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

 参考:

http://blog.csdn.net/zhengzhb/article/category/926691/

http://www.cnblogs.com/java-my-life/archive/2012/05/16/2502279.html

当然JDK里面也自带了接口Observer,以及它的实现类Observable. 我们可以通过调用Java源码实现观察者模式! 

 

以上就是由(it人知识库https://m.itpeo.net/15310/3710240.html)本站为大家整理

Tag:设计模式观察者



我要分享:

  • 微信
  • QQ好友
  • QQ空间
  • 新浪微博


热门推荐

方正T630NVUT630N-440

方正T630NVUT630N-440

<iframe name="google_ads_frame" marginwidth="0" marginhei... ...

学习笔记-android imageSwitcher使用

学习笔记-android imageSwitcher使用

照片切换控件imageSwitcher实现照片上一张、下一张的切换,使用时要实现ViewFactory接口,从而将显示的... ...

ORACLE闪回功能开启和使用

ORACLE闪回功能开启和使用

闪回功能在ORACLE中默认是关闭的,需要按照下面的方式开启: Sql>startup mount Sq... ...

openfire 源代码搭建 开发环境(一)

openfire 源代码搭建 开发环境(一)

1、搭建好java开发环境,要求是在jdk1.6以上   2、在http://www.ignit... ...

[Repeater]导出为excel格式

[Repeater]导出为excel格式

Repeater导出为excel格式 数据绑定到Repeater1 ,下面是将Repeater1的内容导出的示例代码 ... ...

ADO.NET的主要组件

ADO.NET的主要组件

ADO.NET提供了用于访问和操作数据的两个主要组件是 .NET Framework 数据提供程序和 DataSe... ...

C++11新特性中的匿名函数Lambda表达式的汇编实现分析(二)

C++11新特性中的匿名函数Lambda表达式的汇编实现分析(二)

C++11新特性中的匿名函数Lambda表达式的汇编实现分析(一) 首先,让我们来看看以&方式进行变量... ...

C++11新特性中的匿名函数Lambda表达式的汇编实现分析(三)

C++11新特性中的匿名函数Lambda表达式的汇编实现分析(三)

C++11新特性中的匿名函数Lambda表达式的汇编实现分析(一) C++11新特性中的匿名函数Lambda表... ...

[zt]Ajax 和 XML: 五种常见 Ajax 模式

[zt]Ajax 和 XML: 五种常见 Ajax 模式

可立即使用这些非常有用的 Ajax 设计模式 ... ...

MDA:Jean网站上的定义和资源

MDA:Jean网站上的定义和资源

继续纠缠MDA的定义 转自 http://www.sciences.univ-nantes.fr/info/lrsg... ...

Spring Framework 4.0M1 & 3.2.3 发布了[翻译]

Spring Framework 4.0M1 & 3.2.3 发布了[翻译]

今天早上去SpringSource官网,发现Spring Framework 4.0发布了,我认为最重要的两个特性... ...

简单说一下Jfinal Model静态dao对象误用的问题

简单说一下Jfinal Model静态dao对象误用的问题

   最近有很多jfinal的使用者在误用model静态dao,这里简单的说一下这个问题, @... ...

职业生涯第二年回顾(2011.2~2012.2)

职业生涯第二年回顾(2011.2~2012.2)

 算不上什么工作总结和技术总结,只是大致回顾这1年记忆中的事情。    一... ...

使用import简化spring的配置文件 (转载)

使用import简化spring的配置文件 (转载)

Spring中用import导入配置文件 原文地址:使用import简化spring的配置文件 (转载)作者:瓦砾... ...

每天十分钟,十二天入门Python(十)

每天十分钟,十二天入门Python(十)

# __str__() class Dog(object):     de... ...

JQuery:deferred对象的方法

JQuery:deferred对象的方法

(1) $.Deferred() 生成一个deferred对象。 (2) deferred.done() 指... ...

Maven的安装及与eclipse或MyEclipse的关联

Maven的安装及与eclipse或MyEclipse的关联

apache-Maven的下载就不说了,其安装与JDK的安装几乎类似。当然使用Maven的前提是已经安装好了JD... ...

怎么在HiWork中注册团队及添加成员

怎么在HiWork中注册团队及添加成员

周三,天气较热,各位注意身体,多饮水。 使用HiWork,首先要进行团队创建以及成员添加,这样才能愉快地... ...

linux wineQQ与win7QQ共用聊天记录

linux wineQQ与win7QQ共用聊天记录

首先挂载win7硬盘,挂载方法就不介绍了。 然后点开QQ的设置  -> 文件管理 -&g... ...

Clustrix Sierra关系数据库集群

Clustrix Sierra关系数据库集群

Clustrix的Sierra数据库集群引擎是一个share-nothing架构的可伸缩关系数据库集群。官... ...

最新IT资讯

必填

◎已有 0 人评论


电脑版

版权所有:IT人知识库 m.itpeo.net

返回顶部

本网站部分内容来自互联网,版权归原作者所有,文章内容仅代表原作者个人观点,如有侵权请联系我们删除