GOF23设计模式之观察者模式(observer)

一、观察者模式概述

  观察者模式主要用于 1 :N 的通知。当一个对象(目标对象 Subject 或 Observable)的状态变化时,它需要通知一系列对象(观察者对象 Observer),令它们做出响应。

  通知观察者的方式:

    (1)推

        每次都会把通知以广播的方式发送给所有观察者,所有观察者只能被动接收。

    (2)拉

        观察者只要知道有情况即可。至于什么时候获取内容,获取哪些内容,都可以自主决定。

二、观察者模式示例代码

 1 /**
 2  * 观察者对象接口
 3  * @author CL
 4  *
 5  */
 6 public interface Observer {
 7     /**
 8      * 更新主题
 9      * @param subject
10      */
11     void update(Subject subject);
12
13 }
 1 /**
 2  * 主题对象(目标对象)
 3  * @author CL
 4  *
 5  */
 6 public class Subject {
 7
 8     protected List<Observer> list;
 9
10     public Subject() {
11         list = new ArrayList<Observer>();
12     }
13
14     public void addObserver(Observer observer) {
15         list.add(observer);
16     }
17
18     public void removeObserver(Observer observer) {
19         list.remove(observer);
20     }
21
22     /**
23      * 通知所以观察者更新状态
24      */
25     public void notifyAllObserver() {
26         for (Observer o : list) {
27             o.update(this);
28         }
29     }
30
31
32 }
 1 /**
 2  * 具体的目标对象
 3  * @author CL
 4  *
 5  */
 6 public class ConcreteSubject extends Subject {
 7
 8     /**
 9      * 状态
10      */
11     private int state;
12
13     public int getState() {
14         return state;
15     }
16
17     public void setState(int state) {
18         this.state = state;
19         //若主题对象(目标对象)发生的状态发生改变,请通知所有观察者更新状态
20         this.notifyAllObserver();
21     }
22
23 }
 1 /**
 2  * 观察者
 3  * @author CL
 4  *
 5  */
 6 public class ObserverA implements Observer {
 7
 8     private int myState;    //myState需要和目标对象的state保持一致
 9
10     @Override
11     public void update(Subject subject) {
12         myState = ((ConcreteSubject) subject).getState();
13     }
14
15     public int getMyState() {
16         return myState;
17     }
18
19     public void setMyState(int myState) {
20         this.myState = myState;
21     }
22
23 }

  测试:

 1 /**
 2  * 测试观察者模式
 3  * @author CL
 4  *
 5  */
 6 public class Client {
 7
 8     public static void main(String[] args) {
 9         //目标对象
10         ConcreteSubject sub = new ConcreteSubject();
11
12         //创建三个观察者
13         ObserverA o1 = new ObserverA();
14         ObserverA o2 = new ObserverA();
15         ObserverA o3 = new ObserverA();
16
17         //将这三个观察者添加到目标对象subject的容器中
18         sub.addObserver(o1);
19         sub.addObserver(o2);
20         sub.addObserver(o3);
21
22         //修改目标对象的状态值
23         sub.setState(100);
24
25         System.out.println(o1.getMyState());
26         System.out.println(o2.getMyState());
27         System.out.println(o3.getMyState());
28
29         System.out.println("----------------------");
30
31         //修改目标对象的状态值
32         sub.setState(10);
33
34         System.out.println(o1.getMyState());
35         System.out.println(o2.getMyState());
36         System.out.println(o3.getMyState());
37     }
38 }

  控制台输出:

100
100
100
----------------------
10
10
10

三、JDK 中提供类和方法实现观察者模式

  

 1 import java.util.Observable;
 2
 3 /**
 4  * 目标对象
 5  * @author CL
 6  *
 7  */
 8 public class ConcreteSubject extends Observable {
 9     private int state;
10
11     public int getState() {
12         return state;
13     }
14
15     public void setState(int state) {
16         this.state = state;
17
18         setChanged();    //表示目标对象已经更改状态
19
20         notifyObservers();    //通知所有观察者
21     }
22
23 }
 1 import java.util.Observable;
 2 import java.util.Observer;
 3
 4 /**
 5  * 观察者对象
 6  * @author CL
 7  *
 8  */
 9 public class ObserverA implements Observer {
10
11     private int myState;
12
13     @Override
14     public void update(Observable o, Object arg) {
15         myState = ((ConcreteSubject) o).getState();
16     }
17
18     public int getMyState() {
19         return myState;
20     }
21
22     public void setMyState(int myState) {
23         this.myState = myState;
24     }
25
26 }

  测试:

 1 /**
 2  * 测试利用java.util.*包中的类Observable和接口Obsever实现的观察者模式
 3  * @author CL
 4  *
 5  */
 6 public class Client {
 7
 8     public static void main(String[] args) {
 9         //目标对象
10         ConcreteSubject sub = new ConcreteSubject();
11
12         //创建三个观察者
13         ObserverA o1 = new ObserverA();
14         ObserverA o2 = new ObserverA();
15         ObserverA o3 = new ObserverA();
16
17         //将这三个观察者添加到目标对象subject的容器中
18         sub.addObserver(o1);
19         sub.addObserver(o2);
20         sub.addObserver(o3);
21
22         //修改目标对象的状态值
23         sub.setState(666);
24
25         System.out.println(o1.getMyState());
26         System.out.println(o2.getMyState());
27         System.out.println(o3.getMyState());
28
29         System.out.println("----------------------");
30
31         //修改目标对象的状态值
32         sub.setState(123);
33
34         System.out.println(o1.getMyState());
35         System.out.println(o2.getMyState());
36         System.out.println(o3.getMyState());
37     }
38 }

  控制台输出:

666
666
666
----------------------
123
123
123

四、观察者模式常见开发应用场景

  (1)手机APP中每天的推送广告;

  (2)多人联机网络游戏中,服务器实时分发所有玩家的状态;

  (3)Servlet 中监听器的实现;

  (4)Android 中广播机制;

  (5)JDK 的 AWT 事件处理模型,基于观察者模式的委派事件模型(Delegation Event Model)

      事件源:目标对象

      事件监听器:观察者

  (6)…………

原文地址:https://www.cnblogs.com/cao-lei/p/8334075.html

时间: 2024-10-15 14:40:34

GOF23设计模式之观察者模式(observer)的相关文章

设计模式之观察者模式(Observer)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

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

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

设计模式:观察者模式--Observer

一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时观察着小偷,当小偷正在偷东西「就给干警发送出一条信号,实际上小偷不可能告诉干警我有偷东西」,干警收到信号,出击抓小偷.这就是一个观察者模式 2.装模作样写作业 小时候家里家活比较多,爸妈让我去干活的时候,我偶尔会说我要学习「其实不想去干活,当然只是偶尔,我还是常常干家务的」,然后爸妈就去地里了,我一

【GOF23设计模式】观察者模式

来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_观察者模式.广播机制.消息订阅.网络游戏对战原理 1 package com.test.observer; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class Subject { 7 protected List<Observer> list = new ArrayList<Observer>(); 8 9 p

【设计模式】观察者模式 Observer Pattern

定义:观察者模式定义了对象之间的一对多依赖.当“主题”(Object)状态改变事,所有依赖它的“观察者”(Observer)都会受到通知并自动更新.主题支持观察者订阅和退订. 观察者模式提供了一种对象设计,让主题和观察者之间松耦合.改变主题或观察者一方不会影响另一方.因为两者是松耦合的. 参考: 设计模式学习笔记--Observer Pattern观察者模式

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

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

GOF23设计模式之观察者模式之理解

 观察者模式Observer      广播机制的场景:      场景:          聊天室程序的创建.服务器创建好后,A,B,C三个客户端连上来公开聊天.A向服务器发送数据,服务器端聊天数据改变.我们希望将这些聊天数据分别发给其他在线的客户.也就是说,每个客户端需要更新服务器端得数据.          网站上,很多人订阅了"Java主题"的新闻.当有这个主题新闻时,就会将这些新闻发给所有订阅的人.          大家一起玩CS游戏时,服务器需要将每个人的方位变化发给

GOF23设计模式之观察者模式的理解与实现2(使用java自带的观察者类和接口)

 观察者模式Observer      广播机制的场景:      场景:          聊天室程序的创建.服务器创建好后,A,B,C三个客户端连上来公开聊天.A向服务器发送数据,服务器端聊天数据改变.我们希望将这些聊天数据分别发给其他在线的客户.也就是说,每个客户端需要更新服务器端得数据.          网站上,很多人订阅了"Java主题"的新闻.当有这个主题新闻时,就会将这些新闻发给所有订阅的人.          大家一起玩CS游戏时,服务器需要将每个人的方位变化发给

【设计模式】—— 观察者模式Observer

前言:[模式总览]——————————by xingoo 模式意图 观察者模式,也叫发布/订阅模式,从名字来说就能察觉到它的过程应该是,发布——其他人接受. 这个模式定义了对象之间的一种依赖关系,当一个对象发生变化时,其他的对象收到更新,也发生变化. 模拟我们订阅邮件这个场景,不管我们的邮箱是在登陆还是关闭,邮件都会发送到邮箱里面.只要把自己的邮箱订阅到这个邮件就可以了!这个模式也是这样一个过程. 这个模式代码相对来说比较容易理解,而且应用很广泛. 应用场景 1 当一个模型有几个展现方面,通过修