java学习设计模式二:观察者模式

观察者模式

什么是观察者模式

观察者模式(Observer Pattern)是一种常见的设计模式,其定义是:定义对象间的一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。该模式又称为发布-订阅模式(Publish/Subscribe Pattern)或者消息机制(Message Pattern)。

观察者模式最早是由美国计算机科学家克里斯蒂安·霍夫曼(Christian P. Hoffman)提出的,他在1983年的论文《An Application Framework for Building Simulators》中首次提出了该模式。

举个例子

“没头脑”和“不高兴”是公司刚招来的两个程序员,这两个人一看就是个刺头,为了能让领导能更好的监督这两个人干活,我们给领导安排了观察套餐:

当有人在摸鱼时,领导立马会得到警告:注意: 这个小伙子 [没头脑/不高兴 ]在摸鱼!!!

/**
 * 被观察的程序员
 */
public class Programmer {
    private String name;
    private boolean isWorking;
    private List<Observer> observers;

    public Programmer(String name) {
        this.name = name;
        this.isWorking = true;
        this.observers = new ArrayList<>();
    }

    public String getName() {
        return name;
    }

    public boolean isWorking() {
        return isWorking;
    }

    public void setWorking(boolean working) {
        isWorking = working;
        notifyObservers();
    }

    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(this);
        }
    }
}

观察接口

public interface Observer {

    void update(Programmer programmer);

}

观察者==》公司领导

/**
 * 公司领导
 */
public class Leader implements Observer {
    @Override
    public void update(Programmer programmer) {
        if (!programmer.isWorking()) {
            System.out.println("注意: 这个小伙子 [" + programmer.getName() + " ]在摸鱼!!!");
        }
    }
}

应用

public class App {
    public static void main(String[] args) {
        Programmer programmer1 = new Programmer("没头脑");
        Programmer programmer2 = new Programmer("不高兴");

        Leader leader = new Leader();

        programmer1.addObserver(leader);
        programmer2.addObserver(leader);

        programmer1.setWorking(false);
        programmer2.setWorking(false);
    }
}

运行结果:
在这里插入图片描述

典型场景

观察者模式通常用于以下场景:

  • 当一个对象的状态发生改变时,需要通知其他对象进行更新。
  • 当一个对象需要将自己的状态改变通知给其他对象时,需要使用观察者模式。

比如

  1. GUI开发

在GUI(Graphical User Interface,图形用户界面)开发中,观察者模式经常被使用。例如,当用户在文本框中输入文字时,文本框就会自动更新显示。这种情况下,文本框是被观察的对象,输入框则是观察者。

  1. 消息队列

在消息队列中,当一个消息被推送到队列中时,所有订阅该队列的客户端都会收到该消息。这种情况下,消息队列是被观察的对象,订阅者则是观察者。

  1. 事件驱动系统

在事件驱动系统中,当一个事件发生时,所有注册了该事件监听器的对象都会收到该事件通知,并执行相应的操作。这种情况下,事件是被观察的对象,事件监听器则是观察者。

  1. 订阅服务

在订阅服务中,当一个用户订阅了某个服务后,该服务产生的所有更新都会自动发送给该用户。这种情况下,订阅服务是被观察的对象,订阅用户则是观察者。

总之,观察者模式适用于多个对象之间存在一种一对多的依赖关系,并且当被观察对象的状态发生改变时需要通知其他对象进行更新的情况。在实际应用中,我们需要根据具体的业务需求来确定是否使用观察者模式。

优缺点

观察者模式的优点包括:

  • 可以实现一对多的依赖关系,提高了系统的灵活性和可扩展性。
  • 观察者和被观察者之间是松耦合的,可以独立地变化。

观察者模式的缺点包括:

  • 如果观察者过多,会导致通知时间增长,影响程序性能。
  • 如果观察者和被观察者之间有循环依赖关系,会导致系统崩溃。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值