禅说设计模式之生产者消费者模式

·  阅读 63

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

image.png

举例

有点类似于美团买菜。美团买菜就是那个缓冲区。

美团公司先从蔬果批发商那里拿到商品,然后放在城市中的一个仓库,待有消费者下了订单,会统一将商品送到消费者手中,生产者和消费者之间不是直接关系。这就解耦了生产者生产数据之后需要等待消费者消费商品之间的联系。

代码实现

生产者

复制代码

public class Provider { private Context context;

public Provider(Context _context) {
    this.context = _context;
}
public void provide() {
     this.context.setData("商品");
}
复制代码

}

复制代码

缓冲区

public class Context {
    private Provider provider;
    private Consumer consumer;

    public Provider getProvider() {
        return provider;
    }

    public void setProvider(Provider provider) {
        this.provider = provider;
    }

    public Consumer getConsumer() {
        return consumer;
    }

    public void setConsumer(Consumer consumer) {
        this.consumer = consumer;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    private String data;
    public Context() {
        this.provider = new Provider(this);
        this.consumer = new Consumer(this);
    }
}
复制代码

消费者

public class Consumer {
    private Context context;

    public Consumer(Context context) {
        this.context = context;
    }
    public String consume() {
        return this.context.getData();
    }
}
复制代码

测试代码

Context ctx = new Context();
ctx.getProvider().provide();
return "传入的值为:"+ ctx.getConsumer().consume();
复制代码

定义数据单元

  • 数据单元具有独立性,数据单元之间不会相互影响。
  • 数据单元应关联到合适的业务对象。

比如美团买菜,如果按照菜品分类去拜访商品,那么这对于商品分发将是一个灾难。

但如果将数据单元定义为团长所负责的商品,那么只需要团长报出自己的姓名和电话,就可以快速分发商品。

因此定义好数据单元能够极大提高程序的性能。

常见的库

  • 比如React的createContext。
  • 比如RocketMQ消息队列。

我们要真正深入理解这个模式,需要在实战中不断去细化这个模式。

我们在实践过程中,需要清楚到底谁是生产者,谁是消费者,定义怎样的数据单元是合适的。 生产者与消费者之间的通信细节如何设计,这些都是可以进行扩展的。比如队列双缓冲区,比如环形缓冲区,比如在已有数据单元的基础上进一步拆分数据单元,做到更细粒度的控制。

分类:
后端
收藏成功!
已添加到「」, 点击更改