(#)个人对于观察者的理解:观察者与发布订阅模式是非常的相似的,例如当多个威信使用者订阅了同一个主题之后,那么这个主题就是一个被观察者,而这些用户就是观察

者,当这个主题更新了新的内容以后,就要通知所有的观察者,主题更新了新的内容了

(#)TaLK IS CHEEP    场景:服务器解析DNS

1.抽象一个域名解析服务,实现java.util的Observer与Observable

/**
* Author: scw
* Time: 16-12-28
*/
public abstract class DnsServer extends Observable implements Observer{ public void update(Observable o, Object arg) {
Recorder recorder = (Recorder) arg;
if(isLocal(recorder)){
recorder.setIp(getIPAddress());
sign(recorder);
}else{
responseFromUpperServer(recorder);
}
} /**
* 增加观察者
*/
public void setUpperServer(DnsServer dnsServer){
super.deleteObservers();
super.addObserver(dnsServer);
}
/**
* 向父dns请求解析,通知观察者
*/
private void responseFromUpperServer(Recorder recorder){
super.setChanged();
super.notifyObservers(recorder);
} public abstract void sign(Recorder recorder); public abstract boolean isLocal(Recorder recorder); public String getIPAddress(){
return "127.0.1.1";
}
}

2.三个具体的域名解析服务

/**
* Author: scw
* Time: 16-12-28
*/
public class SHDnsServer extends DnsServer {
@Override
public void sign(Recorder recorder) {
recorder.setOwner("上海服务器");
} @Override
public boolean isLocal(Recorder recorder) {
return StringUtils.endsWith(recorder.getDomain(),".sh");
}
} /**
* Author: scw
* Time: 16-12-28
*/
public class ChinaDnsServer extends DnsServer {
@Override
public void sign(Recorder recorder) {
recorder.setOwner("中国服务器");
} @Override
public boolean isLocal(Recorder recorder) {
return StringUtils.endsWith(recorder.getDomain(),".cn");
}
} /**
* Author: scw
* Time: 16-12-28
*/
public class TopDnsServer extends DnsServer {
@Override
public void sign(Recorder recorder) {
recorder.setOwner("世界");
} @Override
public boolean isLocal(Recorder recorder) {
return StringUtils.endsWith(recorder.getDomain(),".www");
}
}

3.ok,上面的步奏都实现了的话,那么接下来随便写一个main方法测试一下就好了,这个很easy,那么大家应该很好奇这两个接口都干了什么呢?下面解析一下

(#)接口解析

1.ObServer,其实这个接口很简单,内部只有一个update方法,所以实现的重点不在这里

2.Observable类,看过源码之后,发现这个类是线程安全的,使用了Vector来存储,所有的观察者,同时对于change的设置也是同步的

下面来看一下关键一个notifyObservers方法:

看见了吧,这个方法的关键就是最后一行代码,也就是说一个观察者的类应该去实现这Observer接口,重写里面的update方法,那么在被观察者做出改变的时候就能很

简单的通知到观察者的update方法。

(#)最后这个接口其实很简单,但是其中涉及到的设计模式还是很值得参考的,而且以前写这种模式的时候也一直是自己来实现,从来发现原来java本身就给我们实现了

这些接口

Observer,Observable实现观察者模式的更多相关文章

  1. java源码阅读Observable(观察者模式)

    1类签名和简介 package java.util; public class Observable Observable是Java内置的观察者模式中的主题类(没错,是类不是接口),和其对应的观察者接 ...

  2. Rx系列二 | Observer | Observable

    Rx系列二 | Observer | Observable 上节课我们对RX的一些基本概念和使用JAVA代码实现了一个观察者,但是这只是对思路的一个讲解,在我们JAVA中,其实是已经封装好了观察者对象 ...

  3. 2.Observer Pattern(观察者模式)

    Observer Pattern(观察者模式)定义: 在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新. 干说定义肯定没有举例理解的透彻.想到Observ ...

  4. RxSwiftライブラリの作り方 〜Observer/Observable編〜

    RxSwiftライブラリの作り方をご紹介します.一つの記事ですべてを説明するのは非常に厳しいので.まず Observer や Observable といった基本的なコンポーネントとその周辺について.ひ ...

  5. Android之观察者/被观察者模式Observer/Observable

    Android 本身也是有观察者模式的.虽然项目中很多需要通知数据改变的地方,用了EventBus,但是不得不说这个观察者模式还是很好用的.最近在开发新版本的时候引用了腾讯的IM,之前写直播的时候就用 ...

  6. 设计模式のObserver Pattern(观察者模式)----行为模式

    一.问题产生背景 又被称为订阅发布模式. 最初流传最广的一个面试题:有一只猫咪,猫咪叫了一声,老鼠跑了,老人惊醒了,男主人骂,小偷吓得不敢动了....这就产生一个问题的模型,当对象间存在一对多关系时, ...

  7. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  8. 设计模式-观察者模式(Observer Pattern)

    本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 观察者模式简述 观察者模式的使用非常广泛,常用于建立起一种多对一的关系,该模式一定会包含两个角色 ...

  9. JAVA设计模式之观察者模式 - Observer

    有趣的事情发生时,可千万别错过了!有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事.对象甚至在运行时可决定是否要继续被通知.有了观察者,你将会消息灵通. 介绍 观察者模式的定义: 在对象之间 ...

随机推荐

  1. Windows Phone 十二、设计器同步

    在设计阶段为页面添加数据源 Blend或者VS的可视化设计器会跑我们的代码,然后来显示出来,当我们Build之后,设计器会进入页面的构造函数,调用InitializeComponent();方法来将U ...

  2. Android驱动开发前的准备

    最近看了一些Android驱动开发前需要知道的资料,收获很多,接下来就谈谈我自己的一些心得体会. Android在近几年时间发展迅速,已经成为智能手机操作系统的老大.不过,因为Android原生的代码 ...

  3. (转)Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    详细解读Jquery各Ajax函数: $.get(),$.post(),$.ajax(),$.getJSON() 一,$.get(url,[data],[callback]) 说明:url为请求地址, ...

  4. Mysql数据库的使用总结之ERROR 1146 (42S02)

    在使用mysql数据库过程中,遇到了错误ERROR 1146 (42S02):Table doesn't exist,经过了两天,终于解决了这个问题.引起该错误的原因不同,对应的解决方法也不同.这里只 ...

  5. [Phalcon] DI默认的服务

    代码,说明一切 namespace Phalcon\Di\FactoryDefault; use Phalcon\Di\Service; use Phalcon\Di\FactoryDefault; ...

  6. lisp等

             

  7. 关于JSON

    JSON:一种数据交换格式,不是一种编程语言.(JSON 语法是 JavaScript 对象表示法语法的子集.) 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaSc ...

  8. Mono.Ceil 无法保存Silverlight 程序集

    一句话: 处理Silverlight程序集之前, 须先移除强名称(StrongNameRemoveHelper), 之后Reflexil 即可一如预期的正常工作.

  9. 视频软件TurboDemo 教程:如何为视频添加旁白和音乐

    在前面的文章中,已经对视频软件TurboDemo如何快速的捕捉屏幕和视频编辑做了一些了解,本文主要来了解如何为视频添加旁白和音乐. Slide Timing 在Player Controls窗口中的单 ...

  10. wex5 实战 框架拓展之2 事件派发与data刷新

    一 前言 讲完公共data,相信大家对框架级的data组件级绑定有了更新的认识,接下来我们继续深入,以求研究明白wex5的框架能力. 在一个web项目中,其实有一个data, 是基础框架必须的data ...