文档章节

设计模式之观察者模式

Lubby
 Lubby
发布于 2015/12/21 13:05
字数 649
阅读 69
收藏 2
点赞 0
评论 0

观察者模式又称为发布订阅模式,里面角色分为观察者,被观察者。被观察者的动作会通知给注册的观察者。

现在设计一个故事,监狱里面有犯人和警察,警察会监控犯人的一举一动。当犯人吃饭的时候,警察会收到通知。

一、简单的观察者实现:

Observable:

public abstract class Observable {
    private Vector<Observer> obs = new Vector<>();

    public void notifyObs(Object param) {
        for (Observer ob : obs) {
            ob.update(param);
        }
    }

    public void addObserver(Observer ob) {
        this.obs.add(ob);
    }

    public void removeObserver(Observer ob) {
        this.obs.remove(ob);
    }

    public int getObserverSize() {
        return this.obs.size();
    }

    public boolean containObserver(Observer ob) {
        return this.obs.contains(ob);
    }
}

Observer:

public interface Observer  {
    void update(Object param);
}

Criminal:

public class Criminal extends Observable {
    public void eat(String food) {
        System.out.println("criminal is eating " + food);
        this.notifyObs(food);
    }
}

Police A:

public class PoliceA implements Observer {
    @Override
    public void update(Object param) {
        System.out.println("police A get message. param is "  + param);
    }
}

Police B:

public class PoliceB implements Observer {
    @Override
    public void update(Object param) {
        System.out.println("police A get message. param is "  + param);
    }
}

Test:

public class Test {
    public static void main(String[] args) {
        Criminal criminal = new Criminal();
        criminal.addObserver(new PoliceA());
        criminal.addObserver(new PoliceB());
        criminal.eat("西餐");
    }
}

上面的代码非常简单,很容易看懂。Observable是对观察者的抽象,里面有个Vectory,放入的是观察者。当有观察者注册的时候就放入到Vectory里面。Crimimal继承了Observable,当犯人吃饭的时候就依次通知Vectory里面的观察者。

JDK里面本身就存在Observable和Observer两个类,方便我们直接使用观察者模式。

二、使用JDK里面观察者的实现

Criminal:

public class Criminal extends Observable {

    public void eat(String food) {
        System.out.println("criminal eat " + food);
        super.setChanged();
        notifyObservers("criminal is eating " + food);
    }
}

Police A:

public class PoliceA implements Observer{
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("Police A watch : " + arg);
    }
}

Police B:

public class PoliceB implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("Police B watch . " + arg);
        System.out.println(o);
    }
}

Test:

public class Test {
    public static void main(String[] args) {
        Criminal criminal = new Criminal();
        criminal.addObserver(new PoliceA());
        criminal.addObserver(new PoliceB());
        criminal.eat("川菜");
    }
}


二、观察者模式的缺点

  1. 当某些观察者执行时间过长,会导致后面的观察者过长的延迟.  

    解决办法:使用异步处理,无论是在观察者端通知的步骤使用异步还是被观察者收到通知然后执行的步骤使用异步,都可以.

  2. 观察者同时也可以是被观察者。广播链太长,可维护性很差。


© 著作权归作者所有

共有 人打赏支持
Lubby
粉丝 53
博文 88
码字总数 48522
作品 0
杭州
程序员

暂无文章

HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!

前言 Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据。 本篇主要想讨论 ConcurrentHashMap 这样一个并发容器,在正式开始之前我觉得有必要谈谈 HashMap,没有它...

crossoverJie
8分钟前
2
0
OSChina 周一乱弹 —— 你的朋友圈有点生锈了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @Devoes :分享Trademark的单曲《Only Love (电视剧《妙手仁心 II》插曲)》: 《Only Love (电视剧《妙手仁心 II》插曲)》- Trademark 手机党少...

小小编辑
今天
249
9
【面试题】盲人坐飞机

有100位乘客乘坐飞机,其中有一位是盲人,每位乘客都按自己的座位号就坐。由于盲人看不见自己的座位号,所以他可能会坐错位置,而自己的座位被占的乘客会随便找个座位就坐。问所有乘客都坐对...

garkey
今天
1
0
谈谈神秘的ES6——(二)ES6的变量

谈谈神秘的ES6——(二)ES6的变量 我们在《零基础入门JavaScript》的时候就说过,在ES5里,变量是有弊端的,我们先来回顾一下。 首先,在ES5中,我们所有的变量都是通过关键字var来定义的。...

JandenMa
今天
2
0
arts-week1

Algorithm 594. Longest Harmonious Subsequence - LeetCode 274. H-Index - LeetCode 219. Contains Duplicate II - LeetCode 217. Contains Duplicate - LeetCode 438. Find All Anagrams ......

yysue
今天
2
0
NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
今天
1
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
1
0
AB 压力测试

Ubuntu 安装AB apapt-get install apache2-utils 使用AB 压力测试 -c 并发数 -n请求总数 ab -c 3000 -n 10000 http://localhost/test/index.php AB只能测试localhost 返回结果 This is Apac......

xiawet
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
1
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部