文档章节

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

shanxi_liyong
 shanxi_liyong
发布于 2015/02/12 09:19
字数 429
阅读 64
收藏 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
粉丝 11
博文 105
码字总数 37173
作品 0
太原
程序员
私信 提问
加载中
请先登录后再评论。
Swift百万线程攻破单例(Singleton)模式

一、不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton { } 这段代码的实现,在shared中进行条...

一叶博客
2014/06/20
3.5K
16
数据库表单生成器--SQLScreens

SQLScreens 是一个使用 Tcl/TK 编写的简单关系型数据库表单生成工具。可让你快速创建查询界面,并指定相应的表和字段。支持多种数据库,包括:MySQL, SQLite, and INFORMIX, and ODBC for o...

匿名
2013/02/17
936
0
cgi模式 web服务器--LiuGinx

liugnix是一个 cgi模式 web服务器。 支持语言 因使用的为CGI 模式,支持所有cgi模式运行的程序。 php python go perl 如何运行 cd mywebsite liugnix_ENV liuginx --help2013/05/07 01:10:43...

Able
2013/05/07
878
0
jQuery幻灯片插件--allinone

allinone 是一款强大的 jQuery 幻灯片插件,为什么说它强大呢?因为它含有 5 种类型的效果,每个类型都有 3 款皮肤,也就是说它有 15 效果之多。allinone 的每款皮肤都很漂亮,所以说,如果使...

dowebok
2013/05/11
1.7K
0
代码生成的底层应用框架--fastCSharp

fastCSharp是一个基于.NET元数据的代码生成的底层应用框架,目标是打造一个“开发+运行”效率双优的开源框架。 经过半年多的时间,除了与web开发直接相关的部分,都已经在fastCSharp part 1...

fastCSharp
2013/05/29
3.8K
0

没有更多内容

加载失败,请刷新页面

加载更多

这些 Java 8 官方挖的坑,你踩过几个?

Java技术栈 www.javastack.cn 关注阅读更多优质文章 导读:系统启动异常日志竟然被JDK吞噬无法定位?同样的加密方法,竟然出现部分数据解密失败?往List里面添加数据竟然提示不支持?日期明明...

Java技术栈
06/09
0
0
Python再夺冠,上古语言COBOL大流行,IEEE Spectrum 2020年度编程语言排行榜出炉!

整理 | 屠敏 出品 | CSDN 博客 领域驱动技术,技术鞭策领域。 近日,IEEE Spectrum 最新发布了 2020 年年度编程语言排行榜。IEEE Spectrum 编程语言排行榜一年发布一次,截止到今年,该排行榜...

软件绿色联盟
今天
6
0
uni-app中使用computed计算属性

computed的理解 computed里面的属性不能在data属性中出现,用来监控computed中自定义的变量 data() {return {url:"",mode:"SD",enableCamera:true,position:"front",beau......

剑龙御武
22分钟前
8
0
阿里政企云体验技术团队招聘

我们是谁 大家好,我们是「「阿里巴巴政企云体验技术」」团队,致力于打造 BG(面向政府和企业)行业背景下顶尖的体验技术,希望通过体验技术赋能我们的客户、产品以及合作伙伴。同时我们也是...

前端Sneaker
今天
0
0
OSI开放式互联参考七层模型网络协议神图!!!

本文分享自微信公众号 - 网络工程师IT技术之家(IT2020_)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。...

18855556625
02/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部