您现在的位置是:首页 > 编程 > 

设计模式(十八):行为型之观察者模式

2025-07-20 21:30:13
设计模式(十八):行为型之观察者模式 一、设计模式分类创建型模式 用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”提供了单例、原型、工厂方法、抽象工厂、建造者 5 种创建型模式结构型模式 用于描述如何将类或对象按某种布局组成更大的结构提供了代理、适配器、桥接、装饰、外观、享元、组合 7 种结构型模式行为型模式 用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任

设计模式(十八):行为型之观察者模式

一、设计模式分类
  • 创建型模式
    • 用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”
    • 提供了单例、原型、工厂方法、抽象工厂、建造者 5 种创建型模式
  • 结构型模式
    • 用于描述如何将类或对象按某种布局组成更大的结构
    • 提供了代理、适配器、桥接、装饰、外观、享元、组合 7 种结构型模式
  • 行为型模式
    • 用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责
    • 提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器 11 种行为型模式
二、观察者模式

1、概述

定义

  • 又被称为发布-订阅(Publish/Subscribe)模式
  • 它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象
  • 这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己

2、结构

在观察者模式中有如下角:

  • Subject:抽象主题(抽象被观察者),抽象主题角把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象
  • ConcreteSubject:具体主题(具体被观察者),该角将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知
  • Observer:抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己
  • ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态

、实现

  • 当你关注的中有新内容更新的话,它就会推送给关注的用户端
  • 使用观察者模式来模拟这样的场景
    • 用户就是观察者
    • 是被观察者
    • 有多个的用户关注了程序猿这个

类图如下:

代码如下:

  • 定义抽象观察者类,里面定义一个更新的方法
代码语言:javascript代码运行次数:0运行复制
public interface Observer {
    void update(String message);
}
  • 定义具体观察者类,用户是观察者,里面实现了更新的方法
代码语言:javascript代码运行次数:0运行复制
public class WeixinUser implements Observer {
    // 用户名
    private String name;

    public WeixinUser(String name) {
         = name;
    }
    @Override
    public void update(String message) {
        println(name + "-" + message);
    }
}
  • 定义抽象主题类,提供了attach、detach、notify三个方法
代码语言:javascript代码运行次数:0运行复制
public interface Subject {
    //增加订阅者
    public void attach(Observer observer);

    //删除订阅者
    public void detach(Observer observer);
    
    //通知订阅者更新消息
    public void notify(String message);
}
  • 是具体主题(具体被观察者),里面存储了订阅该的用户,并实现了抽象主题中的方法
代码语言:javascript代码运行次数:0运行复制
public class SubscriptionSubject implements Subject {
    //储存订阅的用户
    private List<Observer> weixinUserlist = new ArrayList<Observer>();

    @Override
    public void attach(Observer observer) {
        weixinUserlist.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        weixinUserlist.remove(observer);
    }

    @Override
    public void notify(String message) {
        for (Observer observer : weixinUserlist) {
            observer.update(message);
        }
    }
}
  • 客户端程序
代码语言:javascript代码运行次数:0运行复制
public class Client {
    public static void main(String[] args) {
        SubscriptionSubject mSubscriptionSubject=new SubscriptionSubject();
        //创建用户
        WeixinUser user1=new WeixinUser("孙悟空");
        WeixinUser user2=new WeixinUser("猪悟能");
        WeixinUser user=new WeixinUser("沙悟净");
        //订阅
        mSubscriptionSubject.attach(user1);
        mSubscriptionSubject.attach(user2);
        mSubscriptionSubject.attach(user);
        //更新发出消息给订阅的用户
        ("传智黑马的专栏更新了");
    }
}

4、优缺点

优点

  • 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系
  • 被观察者发送通知,所有注册的观察者都会收到信息【可以实现广播机制】

缺点

  • 如果观察者非常多的话,那么所有的观察者收到被观察者发送的通知会耗时
  • 如果被观察者有循环依赖的话,那么被观察者发送通知会使观察者循环调用,会导致系统崩溃

5、使用场景

  • 对象间存在一对多关系,一个对象的状态发生改变会影响其他对象
  • 当一个抽象模型有两个方面,其中一个方面依赖于另一方面时

6、 JDK中提供的实现

  • 在 Java 中,通过 java.util.Observable 类java.util.Observer 接口定义了观察者模式
  • 只要实现它们的子类就可以编写观察者模式实例

Observable类

  • Observable 类是抽象目标类(被观察者),它有一个 Vector 集合成员变量,用于保存所有要通知的观察者对象
  • 下面来介绍它最重要的 个方法
    • void addObserver(Observer o) 方法:用于将新的观察者对象添加到集合中
    • void notifyObservers(Object arg) 方法:调用集合中的所有观察者对象的 update方法,通知它们数据发生改变。通常越晚加入集合的观察者越先得到通知
    • void setChange() 方法:用来设置一个 boolean 类型的内部标志,注明目标对象发生了变化。当它为true时,notifyObservers() 才会通知观察者

Observer 接口

  • Observer 接口是抽象观察者,它监视目标对象的变化
  • 当目标对象发生变化时,观察者得到通知,并调用 update 方法,进行相应的工作

【例】警察抓小偷

警察是观察者,小偷是被观察者。代码如下:

  • 小偷是一个被观察者,所以需要继承Observable类
代码语言:javascript代码运行次数:0运行复制
public class Thief extends Observable {
    private String name;

    public Thief(String name) {
         = name;
    }
    
    public void setame(String name) {
         = name;
    }

    public String getame() {
        return name;
    }

    public void steal() {
        println("小偷:我偷东西了,有没有人来抓我!!!");
        super.setChanged(); //changed  = true
        ();
    }
}
  • 警察是一个观察者,所以需要让其实现Observer接口
代码语言:javascript代码运行次数:0运行复制
public class Policemen implements Observer {
    private String name;

    public Policemen(String name) {
         = name;
    }
    public void setame(String name) {
         = name;
    }

    public String getame() {
        return name;
    }

    @Override
    public void update(Observable o, Object arg) {
        println("警察:" + ((Thief) o).getame() + ",我已经盯你很久了,你可以保持沉默,但你所说的将成为呈堂证供!!!");
    }
}
  • 客户端代码
代码语言:javascript代码运行次数:0运行复制
public class Client {
    public static void main(String[] args) {
        //创建小偷对象(被观察者)
        Thief t = new Thief("隔壁老王");
        //创建警察对象1(观察者)
        Policemen p1 = new Policemen("小李警官");
        //创建警察对象2(观察者)
        Policemen p2 = new Policemen("小张警官");
        //让警察盯着小偷
        t.addObserver(p1);
        t.addObserver(p2);
        //小偷偷东西
        t.steal();
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:202-06-26,如有侵权请联系 cloudcommunity@tencent 删除对象接口设计模式

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1161673.html

相关标签:无
上传时间: 2025-07-20 17:26:46
留言与评论(共有 18 条评论)
本站网友 火龙果的热量
0秒前 发表
建造者 5 种创建型模式结构型模式 用于描述如何将类或对象按某种布局组成更大的结构提供了代理
本站网友 风的作用
16分钟前 发表
并调用 update 方法
本站网友 蒜苗的营养价值
7分钟前 发表
观察者得到通知
本站网友 木马免杀
4分钟前 发表
实现抽象观察者定义的更新接口
本站网友 预防脱发
24分钟前 发表
设计模式(十八):行为型之观察者模式 一
本站网友 碳酸氢钠片
15分钟前 发表
两者之间是抽象耦合关系被观察者发送通知
本站网友 汽车产业
27分钟前 发表
当它为true时
本站网友 邢台美食
10分钟前 发表
它的主要特点是“将对象的创建与使用分离”提供了单例
本站网友 收毛孔
27分钟前 发表
建造者 5 种创建型模式结构型模式 用于描述如何将类或对象按某种布局组成更大的结构提供了代理
本站网友 中信建投下载
11分钟前 发表
观察者
本站网友 可以看三级的网站
11分钟前 发表
进行相应的工作 【例】警察抓小偷 警察是观察者
本站网友 陈山河
17分钟前 发表
我已经盯你很久了
本站网友 中国奥运会金牌榜
27分钟前 发表
原型
本站网友 塘沽租房信息
25分钟前 发表
detach
本站网友 香港游客
30分钟前 发表
一个对象的状态发生改变会影响其他对象当一个抽象模型有两个方面
本站网友 至若春和景明
16分钟前 发表
代码如下:小偷是一个被观察者
本站网友 新片上映电影排行榜
8分钟前 发表
适配器