定义

观察者模式(Observer
Pattern):定义对象中的如出一辙种同等对准几近因关系,使得在一个目标状态有变更时,其连带依赖对象都落关照并于自动更新

切切实实世界之模式

按部就班一些用户订阅了周刊,每次周刊披露的下还见面送及用户眼前

照高考的时节,发送广播通知考试完,考生都使停笔,教师要收卷

以打仗的时,指挥官发命令,战场上之新兵跟军命令决定进攻、撤退、驻守

起及时几乎栽类型

  • 颁发-订阅模式
  • 型-视图模式
  • 源-监听模式
  • 从属者模式

SQL compute by 的使用

简易设计

目标

吃观察的目标,内置抽象观察者集合,定义增加、删除、通知抽象观察者的法子。目标类可以是空虚的也得是切实可行的。如果来实际的抽象业务而贯彻,还好分出目标子类

泛泛观察者

宣称了履新数据的艺术,由目标调用

切切实实观察者

兑现了抽象观察者的翻新数据的主意

若果需要目标的片段态或者数状态,可能还维持着对目标的援

统计 1

观察者模式-类图.png

好采用在同一针对多的通信及。同时,目标和观察者没有最好胜的指和涉及,增加或缩减观察者,不会见针对目标导致影响

摘自:http://www.cnblogs.com/Gavinzhao/archive/2010/07/12/1776107.html

动实例

GROUP
BY子句有只毛病,就是回的结果集中只有协议数据,而没初之事无巨细笔录。如果想在SQL
SERVER中落成这项工作,可以利用COMPUTE
BY子句。COMPTE生成合计作为附加的汇集列出现于结果集的终极。当跟BY一起利用时,COMPUTE
子句以结果集内生成控制中断和归类集中。

HTTP DNS 解析性能监控

起如此一个状况,我们的以接入了 HTTP DNS,接管了几许接口请求的 DNS
解析。现在某些有统计反映接口,在少数地方,需要 DNS
解析的组成部分音,比如解析到的 IP,解析耗时,解析采用的域名服务器地址

俺们好利用观察者来缓解此题材

建一个监控器,内置观察者队列,并提供方来增长、删除观察者

当 DNS
每次发起一不成解析,把多少统计后,交给监控器。然后监控通知所有观察者拿多少

概念目标类 DnsMonitor

public class DnsMonitor {

    private final List<MonitorWatcher> mWatcherList;

    public DnsMonitor() {
        mWatcherList = new CopyOnWriteArrayList<>();
    }

    @Override
    public void onParseResult(ResolveData data) {
        if (data == null || TextUtils.isEmpty(data.host)) {
            return;
        }

        // 通知观察者们,有解析数据了
        for (MonitorWatcher watcher : mWatcherList) {
            watcher.notifyResolveData(data);
        }
    }

    /**
     * 注册监视者
     */
    public void registerWatcher(MonitorWatcher watcher) {
        mWatcherList.add(watcher);
    }

    /**
     * 注销监视者
     */
    public void unregisterWatcher(MonitorWatcher watcher) {
        mWatcherList.remove(watcher);
    }
}

概念观察者

public interface MonitorWatcher {
    /**
     * 通知获取到的解析数据
     */
    void notifyResolveData(ResolveData data);
}

接下来,我们的富有 DNS 解析器,在解析及结果后,调用的 onParseResult
把多少来去

足管 Monitor
做成单例,或者放到单例内,这样即使足以通经过都得以看。所有的观察者们,只待贯彻
MonitorWatcher,然后等正在数量通知过来

事实上这意义还有多细节,比如如何防范唤醒观察者不死,还有哪些让具备解析器使用以及一个监视器。因为和之模式无关,就非列下了

下列 SELECT 语句以简易 COMPUTE
子句生成 titles 表中 price 及 advance 的恳求与累计:

ContentObserver

有如此一个求,我们纪念使明数据库有数的变更,有平等种植结果方法,那就算是开个工作线程,去轮询访问。这样的做法会促成资源大量消耗

Android 提供的同种植艺术,称为内容观察者,可以监听数据库变化后会见打招呼下

依照我们而监听屏幕亮度的更动,并且做有作业。屏幕亮度变化之多寡在网数据库里,我们可以通过
ContentObserver 很轻松地取出

屏幕亮度对应之 Uri 可以这样获得

Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS)

创办观察者

    private static class ScreenBrightnessObserver extends ContentObserver {

        ScreenBrightnessObserver(@NonNull Handler handler) {
            super(handler);
        }

        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);

            // 亮度发生变化了,可以查询最新的亮度,然后做相应的业务

        }
    }

接下来以页面启动的利用注册

mScreenBrightnessObserver = new ScreenBrightnessObserver(new Handler());
getContentResolver().registerContentObserver(Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS), true, mScreenBrightnessObserver);

于页面销毁的时刻注销

getContentResolver().unregisterContentObserver(mScreenBrightnessObserver);

 

EventBus

EventBus 也是观察者模式的一致种植实现

倘我们来差不多个目标,多单观察者,如果每个目标都去管理观察者列表的话,维护起来老吓人

因而这边以抽象出一个层次,可以领略吧信息中心,或者信息总线,内部维护在观察者的列表,目标发出多少变动交给这消息中心开展信息之分发及调度

统计 2

观察者模式-EventBus.png

EventBus
提供了一个百般强劲消息总线,目标发生变化的时,把要通报之音封装成一个个信。把消息通知让订阅该信息之观察者们

好用 EventBus
在召开模块间的通信。把要通知之数据变动封装成事件抛出来。通信的模块没有耦合,发送者不欲明白有哪些接收者。EventBus
会通知到位

USE pubs
SELECT type, price, advance
FROM titles
ORDER BY type
COMPUTE SUM(price), SUM(advance) 

 

下列查询在 COMPUTE 子句被进入可选的 BY
关键字,以转每个组的小计:

 USE pubs

SELECT type, price, advance
FROM titles
ORDER BY type
COMPUTE SUM(price), SUM(advance) BY type

 

是 SELECT 语句的结果用12
个结实集返回,六独组中的每个组都发少数单结果集。每个组的率先只结果集是一个行集,其中蕴涵选择列表中所要的音。每个组的亚独结果集带有
COMPUTE 子句被少单 SUM 函数的小计。

 

compute by 子句之平整:

(1)不可知将distinct与行统计函数一起使用

(2)compute ??? by 子句中 ???出的排列必须出现在甄选列表中

(3)不克以含有compute by 子句的讲话中采用select into
子句,因为包括compute 子句之语句会产生不规则的实践。

(4)如果应用了compute by子句,则须利用order by 子句子, 而且compute
by子句被的排列必须带有在order by
子句被,并且针对列的内外相继和开始项都设一律(说白了compute
by子句被的排列必须是order by子句被列表的布满,或者前边的总是几个)。

(5)如果compute 省略了 by ,则order by 也可以简单

(6)如果compute by
子句包含多排时,会将一个组(第一单列分的组)分成多只子组(利用后面的排列),并针对性各国层子组进行统计。

(7)使用多独compute
by子句时,会独家随不同的组统计出结果。详细信息还是论正常的首先独分组办法展示。

(8)compute by 子句被得应用多只统计函数,他们互不影响

(9)compute by 子句被但是因非带有by ,而光所以compute 
此时无对准眼前信息分组,而就对周消息进行统计。

 

比较 COMPUTE 和 GROUP BY
COMPUTE 和 GROUP BY 之间的区分汇总如下:
GROUP BY
生成单个结果集。每个组都起一个独自含分组依据列和出示该组子聚合的聚合函数的实行。选择列表只能分包分组依据列和聚合函数。

COMPUTE
生成多个结实集。一类结果集带有每个组的明细行,其中涵盖选择列表中之表达式。另一样近似结果集带有组的子聚同,或
SELECT 语词
的总聚合。选择列表可含蓄除分组依据列或聚合函数之外的另表达式。聚合函数以
COMPUTE 子句被指定,而休是于挑列表中。
下列查询利用 GROUP BY
和聚合函数;该查询将回到一个结果集,其中每个组有一行,该行中蕴含该组的会师小计:
USE pubs
SELECT type, SUM(price), SUM(advance)
FROM titles
GROUP BY type
 
证 在 COMPUTE 或 COMPUTE BY 子句被,不能够包含 ntext统计、text 或 image
数据类型。