文档章节

行为型模式--观察者模式(Observed)

shanxi_liyong
 shanxi_liyong
发布于 2015/02/12 09:19
字数 429
阅读 18
收藏 0

观察者模式很好理解,类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。先来看看关系图:

我解释下这些类的作用:MySubject类就是我们的主对象,Observer1和Observer2是依赖于MySubject的对象,当MySubject变化时,Observer1和Observer2必然变化。AbstractSubject类中定义着需要监控的对象列表,可以对其进行修改:增加或删除被监控对象,且当MySubject变化时,负责通知在列表内存在的对象。我们看实现代码:

一个Observer接口:

public interface Observer {  
    public void update();  
}

两个实现类:

public class Observer1 implements Observer {  
  
    @Override  
    public void update() {  
        System.out.println("observer1 has received!");  
    }  
}
public class Observer2 implements Observer {  
  
    @Override  
    public void update() {  
        System.out.println("observer2 has received!");  
    }  
  
}

Subject接口及实现类:

public interface Subject {  
      
    /*增加观察者*/  
    public void add(Observer observer);  
      
    /*删除观察者*/  
    public void del(Observer observer);  
      
    /*通知所有的观察者*/  
    public void notifyObservers();  
      
    /*自身的操作*/  
    public void operation();  
}
public abstract class AbstractSubject implements Subject {  
  
    private Vector<Observer> vector = new Vector<Observer>();  
    @Override  
    public void add(Observer observer) {  
        vector.add(observer);  
    }  
  
    @Override  
    public void del(Observer observer) {  
        vector.remove(observer);  
    }  
  
    @Override  
    public void notifyObservers() {  
        Enumeration<Observer> enumo = vector.elements();  
        while(enumo.hasMoreElements()){  
            enumo.nextElement().update();  
        }  
    }  
}
public class MySubject extends AbstractSubject {  
  
    @Override  
    public void operation() {  
        System.out.println("update self!");  
        notifyObservers();  
    }  
  
}

测试类:

public class ObserverTest {  
  
    public static void main(String[] args) {  
        Subject sub = new MySubject();  
        sub.add(new Observer1());  
        sub.add(new Observer2());  
          
        sub.operation();  
    }  
  
}

输出:

update self!
observer1 has received!
observer2 has receive

© 著作权归作者所有

共有 人打赏支持
shanxi_liyong
粉丝 10
博文 106
码字总数 37225
作品 0
太原
程序员
设计模式笔录(二),设计模式有哪些

本人出道5年,学习、编程、再学习、再编程一路走过,只是在笔和纸留下些脚印,实感惭愧。现开始把自己学习到的心得,实践中的体会,一一贴在互联网上,大家互相学习、探讨,寻找一些技术朋友...

方旭
2011/03/31
0
0
JavaScript常用设计模式

设计模式 设计模式是一种在长时间的经验与错误中总结出来可服用的解决方案。 设计模式主要分为3类: 创建型设计模式:专注于处理对象的创建 Constructor构造器模式,Factory工厂模式,Singl...

a独家记忆
07/13
0
0
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
0
0
设计模式Java Design Pattern-工厂方法模式FactoryMethod

我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个) 单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式 结构性模式(7个) 适配器模式、装饰器模式、代理模式、...

勇敢写信
03/22
0
0
JAVA基础再回首(二十六)——面向对象思想设计原则、设计模式、简单工厂模式、工厂方法模式、单例设计模式之饿汉式和懒汉式、Runtime类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52717096 JAVA基础再回首(二十六)——面向对象思想设计原则、设计模式、简单工厂模...

Aduroidpc
2016/10/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

巨头纷纷进驻物联网行业,围绕巨头布局细分领域,将成为独角兽成长的重要模式

巨头纷纷进驻物联网行业,围绕巨头布局细分领域,将成为独角兽成长的重要模式。 物联网普及的进程正在加速。这已经不是嘴上说说的概念,而是落实为产品与营收的事实。近期,就有不少互联网巨...

个推
30分钟前
1
0
excel操作----主要用于数据库入库

# -*- coding: utf-8 -*-import pymysqlimport xlrdimport uuidfrom xlrd import XLRDErrorfrom sdjn_tourism_api.settings import MYSQL_DATABASE, MYSQL_PORT, MYSQL_HOST, MYSQL_P......

简心
34分钟前
1
0
MySQL联合索引最左原则

为了加快查询速度,我们经常对数据表的多个字段建立联合索引,这里特别对联合索引的最左原则做一下介绍。 当我们使用多个where = 或者 where in 条件进行查询的时候,MySQL会按照已建立的索引...

vinci321
38分钟前
1
0
JAVA多线程编程核心技术-学习笔记

进程和线程 进程是操作系统拓扑管理的基本单位 线程是进程中,独立运行的子任务 线程启动 在多线程中, 代码的顺序 , **[不是]**线程的执行顺序. start()和run() start()是启动新线程执行方法,...

ol_O_O_lo
38分钟前
1
0
mysql创建存储过程

1、delimiter关键字 delimiter关键字就是告诉MySQL解释器,该段命令是否已经结束了,mysql是否可以执行了。默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,那么...

kaixinguo314
47分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部