2 观察者模式(设计模式笔记)

本文介绍观察者模式的概念及其在软件设计中的应用。通过一个具体的例子,详细解释了如何实现对象间的一对多依赖关系,当一个对象状态改变时,所有依赖的对象都会得到通知并更新。

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

2 观察者模式(别名:发布-订阅)

概念

  • 定义对象间的一种一对多的依赖关系,当一个对象状态发生变化时,所以依赖于它的对象都得到通知并被自动更新。

模式的结构与使用

角色

  • 主题(Subject)
  • 观察者(Observer)
  • 具体主题(ConcreteSubject)
  • 具体观察者(ConcreteObserver)

结构

在这里插入图片描述

Subject依赖于Observer最重要!!!

package Observer;

/**
 * @author chx
 * @version 1.0
 * @description: TODO
 * @date 2021/3/15 0015 8:52
 */
public interface Subject {

    void addOberver(Oberserve o);

    void deleteOberver(Oberserve o);
    //通知
    void notifyOberver();
}
package Observer;

/**
 * @author chx
 * @version 1.0
 * @description: TODO
 * @date 2021/3/15 0015 8:53
 */
public interface Oberserve {
    void hearTelephone(String hearMsg);
}
package Observer;

import java.util.ArrayList;
import java.util.List;

/**
 * @author chx
 * @version 1.0
 * @description: TODO
 * @date 2021/3/15 0015 8:56
 */
public class SeekJobCenter implements Subject{

    //通知消息
    private String msg;
    //判断消息是否变化
    private boolean changed;
    //观察者集合
    private List<Oberserve> oberserves;

    public SeekJobCenter() {
        this.msg = "";
        this.changed = false;
        this.oberserves = new ArrayList<Oberserve>();
    }

    @Override
    public void addOberver(Oberserve o) {
        if(!oberserves.contains(o)){
            oberserves.add(o);
        }
    }

    @Override
    public void deleteOberver(Oberserve o) {
        if(oberserves.contains(o)){
            oberserves.remove(o);
        }
    }

    @Override
    public void notifyOberver() {
        if(changed){
            for (Oberserve oberserve : oberserves) {
                oberserve.hearTelephone(msg);
            }
        }
    }

    public void giveNewMsg(String msg){
        if(msg.equals(this.msg)){
            changed=false;
        }else {
            System.out.println("发布了新消息:"+msg);
            changed = true;
            this.msg = msg;
            notifyOberver();
        }
    }
}
package Observer;

/**
 * @author chx
 * @version 1.0
 * @description: TODO
 * @date 2021/3/15 0015 9:07
 */
public class UniverStudent implements Oberserve{

    private Subject subject;

    public UniverStudent(Subject subject) {
        this.subject = subject;
        //自动添加观察者(关联的主要作用)
        this.subject.addOberver(this);
        System.out.println("我是物电专业的");
    }

    @Override
    public void hearTelephone(String hearMsg) {
        if (hearMsg.contains("嵌入式") || hearMsg.contains("物联网")){
            System.out.println("感兴趣 "+hearMsg);
        }else {
            System.out.println("不感兴趣");
        }
    }
}
package Observer;

/**
 * @author chx
 * @version 1.0
 * @description: TODO
 * @date 2021/3/15 0015 9:07
 */
public class Returness implements Oberserve{

    private Subject subject;

    public Returness(Subject subject) {
        this.subject = subject;
        //自动添加观察者(关联的主要作用)
        this.subject.addOberver(this);
        System.out.println("我是计算机专业的");
    }

    @Override
    public void hearTelephone(String hearMsg) {
        if (hearMsg.contains("Java") || hearMsg.contains("Python")){
            System.out.println("感兴趣 "+hearMsg);
        }else {
            System.out.println("不感兴趣");
        }
    }
}
package Observer;

/**
 * @author chx
 * @version 1.0
 * @description: TODO
 * @date 2021/3/15 0015 9:16
 */
public class Application {
    public static void main(String[] args) {

        SeekJobCenter center = new SeekJobCenter();
        UniverStudent us = new UniverStudent(center);
        Returness rt = new Returness(center);

        center.giveNewMsg("需要9个嵌入式开发");
    }
}

优点

  • 具体主题和具体观察者是松耦合关系。由于主题(Subject)接口仅仅依赖于观察者(Observer)接口,因此具体主题只是知道它的观察者是实现观察者(Observer)接口的某个类的实例,但不需要知道具体是哪个类。同样,由于观察者仅仅关联于主题(Subject)接口,因此具体观察者只是知道它依赖的主题是实现主题(subject)接口的某个类的实例,但不需要知道具体是哪个类。(即两者都只需和接口打交道,相互扩展性就会高了很多)
  • 观察模式满足“开-闭原则”。主题(Subject)接口仅仅依赖于观察者(Observer)接口,这样,我们就可以让创建具体主题的类也仅仅是依赖于观察者(Observer)接口,因此如果增加新的实现观察者(Observer)接口的类,不必修改创建具体主题的类的代码。同样,创建具体观察者的类仅仅依赖于主题(Observer)接口,如果增加新的实现主题(Subject)接口的类,也不必修改创建具体观察者类的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值