首页 > 其他分享 >观察者模式

观察者模式

时间:2022-10-24 14:23:38浏览次数:37  
标签:Observer observer void 观察者 模式 public

观察者模式

观察者模式(Observer Design Pattern):在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会得到通知并自动更新。

观察者模式通用代码

复制代码
/**
 * 观察者
 */
public interface Observer {
    // 更新方法
    void update();
}
复制代码 复制代码
/**
 * 具体观察者
 */
public class ConcreteObserver implements Observer{
    @Override
    public void update() {
        System.out.println("接受到信息,并进行处理");
    }
}
复制代码 复制代码
/**
 * 被观察者
 */
public abstract class Subject {
    // 定义一个观察者数组
    private List<Observer> obsList = new ArrayList<>();
    // 增加一个观察者
    public void addObserver(Observer observer){
        obsList.add(observer);
    }
    // 删除一个观察者
    public void delObserver(Observer observer){
        obsList.remove(observer);
    }
    // 通知所有观察者
    public void notifyObservers(){
        for (Observer observer : obsList){
            observer.update();
        }
    }
}
复制代码 复制代码
/**
 * 具体被观察者
 */
public class ConcreteSubject extends Subject{
    // 具体的业务
    public void doSomething(){
        super.notifyObservers();
    }
}
复制代码 复制代码
public class ObserverClient {

    public static void main(String[] args) {
        // 创建一个被观察者
        ConcreteSubject subject = new ConcreteSubject();
        // 定义一个观察者
        Observer observer = new ConcreteObserver();
        // 观察者观察被观察者
        subject.addObserver(observer);
        subject.doSomething();
    }
}
复制代码

观察者模式优点

①、观察者和被观察者之间是抽象耦合

不管是增加观察者还是被观察者都非常容易扩展,在系统扩展方面会得心应手。

②、建立一套触发机制

被观察者变化引起观察者自动变化。但是需要注意的是,一个被观察者,多个观察者,Java的消息通知默认是顺序执行的,如果一个观察者卡住,会导致整个流程卡住,这就是同步阻塞。

所以实际开发中没有先后顺序的考虑使用异步,异步非阻塞除了能够实现代码解耦,还能充分利用硬件资源,提高代码的执行效率。

另外还有进程间的观察者模式,通常基于消息队列来实现,用于实现不同进程间的观察者和被观察者之间的交互。

观察者模式应用场景

①、关联行为场景。

②、事件多级触发场景。

③、跨系统的消息交换场景, 如消息队列的处理机制。

标签:Observer,observer,void,观察者,模式,public
From: https://www.cnblogs.com/happy12123/p/16821293.html

相关文章

  • 直播电商平台开发,设计模式单例模式
    直播电商平台开发,设计模式单例模式1.说明单例即只有一个实例,比如说配置、日志、连接池等,可以避免多个实例带来的多余的资源开销,并且在多线程环境下保证数据安全 2.类......
  • 标准SPI协议应用笔记:四种模式区分(CPOL/CPHA)
    前言标准的四线SPI包括CS、MISO、MOSI、CLK四根线,同时根据时钟线的相位和极性可以分为四种模式CPOL代表时钟的极性Polarity,即时钟线有效时(active)和无效时(inacitve)的电平......
  • golang隧道模式示例
    packagemainimport("net/url""net/http""bytes""fmt""io/ioutil")constProxyServer="ip.hahado.cn:3......
  • LVS DR模式 RealServer 为 Windows 2008 R2配置
    有3篇文档详细介绍​​http://kb.linuxvirtualserver.org/wiki/Windows_Servers_in_LVS/DR_and_LVS/TUN_Clusters​​​​http://blog.loadbalancer.org/direct-server-retu......
  • golang隧道模式代码示例
    packagemainimport("net/url""net/http""bytes""fmt""io/ioutil")constProxyServer="ip.hahado.cn:39010"typeProxyAuthstruct{LicensestringSecretKe......
  • 行为型设计模式之解释器模式
    解释器模式解释器模式属于行为型模式。它是指给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。是一种按照规定的语法(文法)进行......
  • 设计模式之原型模式
    概述在使用原型模式时,需要首先创建一个原型对象,再通过复制这个原型对象来创建更多同类型的对象。其定义如下:使用原型实例指定创建对象的种类,并且通过克隆这些原型创建新的......
  • 浅谈PHP设计模式的工厂模式
    简介工厂模式属于创建型模式,可以分为三种:简单工厂、工厂模式、抽象工厂。通俗讲就是用于如何优雅的创建对象而设计。当开发者不知道建什么对象,或者创建方式过于复杂的时......
  • 共体经济的无盈利运行模式
    我们通常认为:生产与经营就是为了盈利,盈利就是赚取生产成本价格与销售价格之间的差价,不过,要说农民春天撒下种子,秋天收获粮食,这是在盈利,那就成笑话了,可见,盈利和创造劳动价值......
  • 设计模式 - 桥接模式
    目录实例数据转换工具桥接模式概念角色定义典型代码具体实现总结源码实例数据转换工具Sunny软件公司欲开发一个数据转换工具,可以将数据库中的数据转换成多种文件格式,例......