设计模式—观察者模式

观察者模式

观察者模式(Observer Pattern) 也叫做发布订阅模式(Publish/subscribe) ,它是一个在项目中经常使用的模式。

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

模式类型:观察者模式

优点

  • 观察者和被观察者之间是抽象耦合
  • 建立一套触发机制

缺点

观察者模式需要考虑一下开发效率和运行效率问题, 一个被观察者, 多个观察者, 开发和调试就会比较复杂, 而且在Java中消息的通知默认是顺序执行, 一个观察者卡壳, 会影响整体的执行效率。 在这种情况下, 一般考虑采用异步的方式

使用场景

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

案例分析

  • 观察者接口
/**
 * @author admin
 */
public interface IObserver {
    /**
     * 前置操作
     */
    void before();

    /**
     * 跟新操作
     */
    void update();

    /**
     * 后置操作
     */
    void after();
}
  • 观察者实现
/**
 * @author admin
 */
public class FirstObserver implements IObserver {
    @Override
    public void before() {
        System.out.println("FirstObserver is doing before action.");
    }

    @Override
    public void update() {
        before();
        System.out.println("FirstObserver is updating.");
        after();
    }

    @Override
    public void after() {
        System.out.println("FirstObserver is doing after action.");
    }
}
  • 被观察者接口
/**
 * @author admin
 */
public interface ISubject {
    /**
     * 增加观察者
     *
     * @param observer 观察者
     * @return 是否成功
     */
    boolean addObserver(IObserver observer);

    /**
     * 移除观察者
     *
     * @param observer 观察者
     * @return 是否成功
     */
    boolean removeObserver(IObserver observer);

    /**
     * 通知所有观察者
     */
    void notifyAllObservers();
}
  • 被观察者具体实现
/**
 * 具体主题
 */
public class ConcreteSubject implements ISubject {
    List<IObserver> list = new ArrayList<>();

    @Override
    public boolean addObserver(IObserver observer) {
        list.add(observer);
        return true;
    }

    @Override
    public boolean removeObserver(IObserver observer) {
        list.remove(observer);
        return true;
    }

    @Override
    public void notifyAllObservers() {
        for (IObserver observer : list) {
            observer.update();
        }
    }
}
  • 客户端
/**
 * @author admin
 */
public class Client {
    public static void main(String[] args) {
        ConcreteSubject concreteSubject = new ConcreteSubject();
        concreteSubject.addObserver(new FirstObserver());
        concreteSubject.notifyAllObservers();
    }
}
  • 执行结果

FirstObserver is doing before action.
FirstObserver is updating.
FirstObserver is doing after action.

posted @   弘一  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示