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

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

(#)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. 利用zlib库进行zip解压

    1:到zlib官网上下载zlib,本文下载的是1.2.8的版本. 2:进行./configure,然后make. 3:进入zlib库中的contrib/minizip/路径下make,生成的miniz ...

  2. there are no packages available for installation插件安装问题和如何配置浏览器的快捷键

    sublime text3 在安装插件时,有时候会莫名其妙的弹出如下所示的弹窗(之前遇到了,但写的时候不知道为什么我的又可以了,这个只是出现了这个问题之后可以尝试的一个解决办法,图片就从网上找了一个) ...

  3. 利用selector设置ImageButton不同状态下的背景图片

    1.自定义MyButton类 public class MyButton extends Button { //This constructormust be public MyButton(Cont ...

  4. R 操作矩阵和计算SVD的基本操作记录

    在R中可以用函数matrix()来创建一个矩阵,应用该函数时需要输入必要的参数值. > args(matrix) function (data = NA, nrow = 1, ncol = 1, ...

  5. 《写给大忙人看的java se 8》笔记

    现在才来了解java8,是不是后知后觉了点? 新的编程技术,个人不喜欢第一时间跟进. 待社区已有实践积淀再切入似乎更划算些? 一点点精明的考虑. 不多说,上代码. //读<写给大忙人看的java ...

  6. iOS开发随笔

    突然看到一个搞11年IT的前辈 他的简历给人焕然一新的感觉 IOS:深入理解object-c语言 内存管理(ARC,MRC, 写回传),GCD,RunLoop,RunTime,,Block,Deleg ...

  7. angular.extend()和 angular.copy()的区别

    1.angular.copy angular.copy(source, [destination]);  // source: copy的对象. 可以使任意类型, 包括null和undefined. ...

  8. SQL Server2014,附加数据库失败,错误为:5120的解决方法

    在SQL Server 2014附加数据库的时候,报错为: 无法打开物理文件XXX,操作系统错误5(拒绝访问),SQL Server 错误5120 解决方法:  我的电脑→管理→服务和应用程序→ 服务 ...

  9. Netsuite > Foreign Currency Revaluation 外币评估

    MENU: Transactions > Financial > Revalue Open Currency Balances 使用频率: - 每个月月底,结账前, 手工操作. - 或者在 ...

  10. android shortcut &livefoulder

    android shortcut(实现步骤) 1.建立activity 2.minifest 里面注册并加上intent-filter,name为:android.intent.action.CREA ...