观察者模式

本文介绍了一种常用的设计模式——观察者模式,通过一个超市即时通知系统的案例,详细讲解了观察者模式的工作原理及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 解决、解耦的钥匙——观察者模式 #

定义 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都回得到通知并被自动更新。

使用场景 

    (1)关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系
    (2)事件多级触发场景
    (3)跨系统的消息交换场景,如消息队列、事件总线的处理机制

简单实现

现在有一家超市弄了一个即使通知系统每当有新菜到的时候都会通知订阅的客户前来选购。这个其实就是个
观察者模式 下面我们来看看怎么实现的



//顾客是观察者

public class Customer implements Observer{
    private String name;

    /**
     * @param name
     */
    public Customer(String name) {
        super();
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        // TODO Auto-generated method stub
        System.out.println(name + arg.toString());
    }

}   

//超市是被观察者

public class SuperMarket extends Observable{
    public void postUpdate(String content) {
        //标识发生改变
        setChanged();
        notifyObservers(content);
    }
}

//客户端调用

public class Client {
    public static void main(String[] args) {
        SuperMarket superMarket = new SuperMarket();
        Customer customer1 = new Customer("小明");
        Customer customer2 = new Customer("小红");
        Customer customer3 = new Customer("小刚");

        superMarket.addObserver(customer1);
        superMarket.addObserver(customer2);
        superMarket.addObserver(customer3);

        superMarket.postUpdate("我们上新货啦 快来买吧");
    }
}

下面呢看看结果就知道了 


小刚我们上新货啦 快来买吧
小红我们上新货啦 快来买吧
小明我们上新货啦 快来买吧


可以看到所有订阅了超市的用户都收到了更新消息,一对多的订阅——发布系统就完成了

Observer和Observable是    JDK内置的类型,可以见得观察者模式是非常重要的。这里Observer是抽象的观察者角色
,Customer扮演的是具体观察者的角色;Observable对应的是抽象主题角色,SuperMarket则是具体的主题角色。
Customer是具体的观察者,它们订阅了SuperMarket这个具体的可观察对象,当SuperMarket有更新时会遍历所有的
观察者,然后给这些观察者发布一个更新消息,就是调用了Customer的update方法这样就达到了一对多的通知功能。
在这个过程中,通知系统都是依赖的Observer和Observable这些抽象类,因此,对于Customer和SuperMarket完全
没有耦合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值