Observer,Observable实现观察者模式

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

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

(#)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本身就给我们实现了

这些接口

时间: 2024-10-07 17:22:36

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

Java观察者模式 : Observer / Observable

/** Java观察者模式的场景:一个女孩洗澡,被很多男孩偷看. 女孩洞察后,搜索坏男孩,然后继续洗澡. 三个类:Boy,Girl还有主类MainClass. */ /* 男孩 Boy.java */ import java.util.Observable; import java.util.Observer; public class Boy implements Observer{ private String name=""; public Boy(String name){ t

Observer Observable

package com.util.ObservDemoTest; import java.util.Observable; import java.util.Observer; public class ObservDemo extends Observable {     MyView view;     MyModel model;     public ObservDemo() {         view = new MyView();         model = new MyMod

设计模式----行为型模式之观察者模式(Observer Pattern)

下面是阅读<Head First设计模式>的笔记. 观察者模式 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. JDK API内置机制 JDK1.0版本就已经包含了java.util.Observer和java.util.Observable,TODO. java.util.Observer是一个接口,所有使用内置机制实现观察者模式,都需要实现该接口.该接口只定义了一个方法 void update(Observable o, Object a

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

本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 观察者模式简述 观察者模式的使用非常广泛,常用于建立起一种多对一的关系,该模式一定会包含两个角色,观察者和被观察的对象,当被观察的对象发生变化的时候观察者会接受到相应的通知. 策略模式的定义与基本结构 定义:定义一个一对多的依赖关系,当被多个对象依赖的那个对象发生改变的时候,所有依赖它的对象都会得到相应的通知并进行状态的更新. 让我们来看一张来自<Head First>的结构图. Subje

[RxJS] Subject: an Observable and Observer hybrid

This lesson teaches you how a Subject is simply a hybrid of Observable and Observer which can act as a bridge between the source Observable and multiple observers, effectively making it possible for multiple observers to share the same Observable exe

Java设计模式之观察者模式(Observer Pattern)

Observer Pattern 是一种常用的设计模式,它是一种事件监听模型.该模式有两个角色,一个是Subject, 另一个是Observer.Subject 保存有多个Observer的引用,一旦特定的事件发生,Subject会通知它所有的Observer,Observer得到该通知后执行相关程序逻辑.其中,Observer只有先向Subject注册后才能被Subject知晓.这就像订报纸,只有我们向出版社提出订报的申请,出版社才会把我们列入订阅者名单,然后每当新报纸印好时,出版社会通知订阅

人人都会设计模式:观察者模式--Observer

https://segmentfault.com/a/1190000012295887 观察者模式是抽像通知者和观察者,达到具体通知者跟具体观察者没有偶合.能达到不管是切换通知者,或者是切换观察者,都不会去操作其它的类! 一.什么是观察者模式 Observer模式也叫观察者模式,是由GoF提出的23种软件设计模式的一种.Observer模式是行为模式之中的一个,它的作用是当一个对象的状态发生变化时,可以自己主动通知其它关联对象,自己主动刷新对象状态. 观察者模式(Observer)完美的将观察者

&lt;&lt;Head First设计模式&gt;&gt;之观察者模式学习

1.概念 定义了对象之间的一对多依赖关系,当一个对象(主题对象)的状态改变时,它的所有依赖者(观察者对象)都会收到通知并自动更新. 2.优势 观察者模式实现了主题对象与观察者对象之间的松耦合,当有新的观察者时,无需修改主题对象的代码,只需要新的观察者对象实现接口.在程序运行的过程中,可以随时注册和删除观察者而不影响主体对象. 观察者模式使主题(Subject)对象和观察者(Observer)对象都可以被轻易地复用. 3.Java中观察者模式 Java API有内置的观察者模式,java.util

面向对象的设计模式(七),观察者模式

似乎全部的设计模式都是为了使得程序具有低耦合,灵活性高,可扩展性好.程序结构清晰等等. 今天的这个设计模式-观察者模式自然也不例外.但程序结构清晰可能就不是重点了. 好吧,废话少说,模式这样的简单粗暴的东西还是要快点学习.以下直接进入正题. 定义:观察者模式是让对象与对象之前建立一种一对多(不是Bean之前的一对多)的关系,这样的关系使得当一的一方的状态改变时,全部多的一方自己主动依据一的一方的改变做出对应的改变. 使用场景: 事件多级触发.如一个公司,CEO是最顶层的被观察者(一的一方),观察