设计模式之观察者模式

本文介绍了观察者模式,它是一种行为型设计模式,可将观察者和被观察者代码解耦。文中阐述了其核心角色、优缺点及不同实现方式,还介绍了EventBus框架的使用和原理。最后对比了观察者模式和监听器模式,指出监听器模式是其扩展。

设计模式之观察者模式

观察者模式,也称发布订阅模式,是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生了改变时,其所有依赖对象都会收到通知并自动更新。我们就可以简单地称这一个被依赖的对象为被观察者,多个依赖对象为观察者。

其实概括性地讲,设计模式要干的事情就是解耦。创建型模式是将创建和使用的代码解耦,结构型模式是将不同功能的代码解耦,行为型模式是将不同行为的代码进行解耦。而具体到观察者模式就是将观察者和被观察者的代码进行解耦。这也是观察者模式要解决的问题,在解决一个对象改变给其他对象通知的问题时,既要考虑到易用和低耦合,又要保证高度的协作。

那么该怎么解决呢,可以通过面向对象的手段将依赖的关系进行弱化。那又该如何做呢,那就不得不先指出观察者模式中的核心角色了:

  • 主题(Subject):也可以称之为可观察者和被观察者。它是一个具有状态的对象,维护一个观察者列表,提供添加、删除、通知观察者的方法;
  • 观察者(Observer):接收主题通知的对象。实现一个更新方法,当接受通知时,进行更新操作。
  • 具体主题(Concreate Subject):主题的具体实现类。
  • 具体观察者(Concreate Observer):观察者的具体实现类。

这里再附上一张UML类图,来将这四者的关系表达更加明确一些:

在这里插入图片描述

在这里,或许你就会明白所谓的靠面向对象的手段将依赖的关系进行弱化,实则就是使用继承和多态将具体的主题和具体的观察者进行解耦。这样,当我们想要改变某个类的具体逻辑,或是增加一个观察者时,就不需要去动主题中的代码了。这也是观察者模式的优点:观察者和被观察者是抽象耦合的。接下来我再给出一份代码样例,还是经典的猫捉老鼠的案例:

/**
 * 主题类
 */
public abstract class Subject {
   
   
    
    private List<Observer> observers = new ArrayList<Observer>();
    private int state;
    
    // 用于增加观察者
    public abstract void attach(Observer obs);
    // 用于删除观察者
    public abstract void detach(Observer obs);
    // 用于通知观察者
    public abstract void notify();

    public abstract int getState();
    public abstract void setState(int state);
}
/**
 * 观察者类
 */
public interface Observer {
   
   
    public void update();
}
/**
 * 具体的主题类,以老鼠为例
 */
public class Mouse extends Subject {
   
   
    
    private List<Observer> obsevers = new ArrayList<Observer>();
    private int state;

    public void attach(Observer
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值