大话设计模式-----观察者模式

本文介绍了观察者模式的基本概念,通过订阅报纸的例子详细解释了该模式的工作原理。文章中定义了主题与观察者的角色,并提供了具体的Java实现代码示例,包括主题接口、观察者接口以及具体的实现类。

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

1 什么是观察者模式

观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖着都会收到通知并且自动更新。

2 一个例子

比如说定报纸

  1. 报社的业务就是出版报纸。
  2. 向某家报社订报纸,只要你是他们的订户,你就一直会收到新的报纸。
  3. 当你不想看报纸了,你就取消订阅。
  4. 只要报社没有倒闭,就会源源不断的有人订阅报纸或者取消订阅。

3 构成

观察者模式有两大组成,一个是:主题,也就是我们的报社,另外一个就是观察者,也就是我们的用户。如图:

这里写图片描述

3 例子

主题接口

public interface ISubject {

    public void registObserver(IObserver o);
    public void removeObserver(IObserver o);

    /**
     * 当主题改变时便会通知所有观察者
     */
    public void notifyObservers();
}

观察者接口

public interface IObserver {

    /**
     * 当出新报纸了,主题便会调用这个方法,把新报纸内容传递过来。
     * @param content
     */
    public void update(String content);
}

报纸类

public class NewsPaper implements ISubject {

    private ArrayList<IObserver> obs;
    private String content;

    @Override
    public void registObserver(IObserver o) {
        obs.add(o);
    }

    @Override
    public void removeObserver(IObserver o) {
        obs.remove(o);
    }

    @Override
    public void notifyObservers() {
        for (IObserver ob : obs) {
            ob.update(content);
        }
    }

    public NewsPaper() {
        obs = new ArrayList<IObserver>();
    }

    /**
     * 出新报纸调用这个方法
     * @param content
     */
    public void publish(String content){
        this.content = "新报纸出版了,内容是:"+content;
        notifyObservers();
    }
}

公司类(公司也可以订报纸)

public class Company implements IObserver {

    @Override
    public void update(String content) {
        System.out.println("公司收到了新报纸,"+content);
    }

}

个人类

public class Person implements IObserver {

    @Override
    public void update(String content) {
        System.out.println("个人收到了新报纸,"+content);
    }

}

测试类

public class MyTest {
    public static void main(String[] args) {
        NewsPaper newspaper = new NewsPaper();
        Person person = new Person();
        Company company = new Company();

        // 订报纸
        newspaper.registObserver(person);
        newspaper.registObserver(company);
        //发行报纸
        newspaper.publish("周三的新报纸");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值