设计模式的思考之一---协议通信中的发布订阅模式的广泛应用

本文介绍发布订阅模式(publish-subscribe),一种重要的设计模式。通过广播电台等实例解释其原理,并探讨其在软件开发中的应用,特别是在协议使用方面的优势。文中提供了C++和Java两种语言的具体实现案例。

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

    现在的程序规模越来越大,变化更新速度越来越快,不在是一个公司一个人的从头到尾,Debug,Release,而是多个人的通力协作完成。

    在过程中,由于人的性格和工作特点的差异,导致在整理和编程过程中,出现各种的设计方法,嵌套关系导致在修改时会发生较大的时间量来研读代码,所以在过程中要有一些统一,以加快在认知和使用修改的能力。

    所以第一种提到的设计模式,叫做发布订阅模式(publish-subscribe),属于观察者模式的一种,特别说明一下,观察者模式是消息收集模式,在使用React Native开发时,就会Observer进行观察收集消息事件,也就是说Observer对应是Event,而不是按照安卓JAVA的运行体系需要自行建立消息传送事件触发机制,让我看来其实的思想是一致的

    发布订阅模式广泛存在于协议使用。在轨道行业的TRDP、汽车行业的CanOpen、物联网行业的MQTT协议都存在着广泛的应用。

    先讲逻辑怎么实现的,

    这个模式用来作为中间人,一个把发布者和订阅者架接在一起的代理。发布者是当完成某些过程的时候触发事件的对象,订阅者是希望当发布者   发布的时候希望被通知的对象。

    生活中有一个很好地例子,广播电台,人们会把频道调到他们最喜欢的节目。广播站不知道观众听得是什么或者他们正在听什么。他只需要发布他们的节目就可以啦。观众也不知道广播站制作节目的过程。他们只要在他们最喜欢的节目运行的时候把台调到对应的频道或者告知朋友就行。

发布/订阅者模式实现了松耦合:你可以让发布者发布消息,订阅者接受消息而不是寻找一种方式把两个分离的系统连接在一起。j简单的说,就是讲发送和接受任务更加独立,便于协议任务的添加和删减,还有一些推模型和拉模型其他文章里有说明,可以有时间自己去研究。

    接下来将以两种方式C++和Java两种方式实现。

    第一种C++

      typedef enum    

    {

    Channel_MASTER;

    Channel_SINK;

    } Type

    typedef struct 

    {

          Type type;

          uint32_t property_A;  //属性A

          uint32_t property_B;  //属性B    

          ...

          uint32_t size 

          unsigned char data[BUFFER_MAX]            ;  /* data buffer */            

    }Port_channel;

   void  create_master_Port_channel(property_A,property_B,...

   {

    完成对要发布Port_channel 的端口的创建和封装

   }

   void  create_sink_Port_channel(property_A,property_B,...) 

   {

    完成对订阅Port_channel 的端口的创建和封装

   }

   void setupdate()

   {

     后台的通道更新

   }

   再创立Process完成收发数的解析

    process_data();

  第二种 JAVA语言的实现:

  java要创建多个类完成这个功能,讲个定报纸的例子。

  有家报社出版报纸A,被张三,李四,王五定了。

 1. 主题接口类

package observer;

public interface Subject {
    //添加观察者
    void addObserver(Observer obj);
    //移除观察者
    void deleteObserver(Observer obj);
    //当主题方法改变时,这个方法被调用,通知所有的观察者
    void notifyObserver();
}
2.观察者接口类
package observer;

public interface Observer {
    //当主题状态改变时,更新通知
    public void update(int version);
}

3.主题实现接口类

package observer;

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

public class MagazineSubject implements Subject{
    //存放订阅者
    private List<Observer> observers=new ArrayList<Observer>();
    //期刊版本
    private int version;

    @Override
    public void addObserver(Observer obj) {
        observers.add(obj);
    }

    @Override
    public void deleteObserver(Observer obj) {
        int i = observers.indexOf(obj);
        if(i>=0){
            observers.remove(obj);
        }
    }

    @Override
    public void notifyObserver() {
        for(int i=0;i<observers.size();i++){
            Observer o=(Observer)observers.get(i);
            o.update(version);
        }
    }

    //该杂志发行了新版本
    public void publish(){
        //新版本
        this.version++;
        //信息更新完毕,通知所有观察者
        notifyObserver();
    }
}

4.observer实现类

package observer;

public class CustomerObserver implements Observer{
    //订阅者名字
    private String name;
    private int version;

    public CustomerObserver(String name){
        this.name = name;
    }

    @Override
    public void update(int version) {
        this.version=version;
        System.out.println("该杂志出新版本了");
        this.buy();
    }

    public void buy(){
        System.out.println(name+"购买了第"+version+"期的杂志!");
    }

}

5.测试类

package observer;

public class Main{
    public static void main(String[] args) {
        //创建主题(被观察者)
        MagazineSubject magazine = new MagazineSubject();
        //创建三个不同的观察者
        CustomerObserver a = new CustomerObserver("张三");
        CustomerObserver b = new CustomerObserver("李四");
        CustomerObserver c = new CustomerObserver("王五");
        //将观察者注册到主题中
        magazine.addObserver(a);
        magazine.addObserver(b);
        magazine.addObserver(c);

        //更新主题的数据,当数据更新后,会自动通知所有已注册的观察者
        magazine.publish();
    }
}

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值