python发布订阅者模式(超简版)

2021-04-27 10:53:44 浏览数 (1)

1、生产者基类(父类)

代码语言:javascript复制
class BaseProducer(object):
    '''
    生产者
    '''
    def __init__(self,name):
        '''
        初始化生产对象
        :param name:生产名称
        '''
        self.name = name
        self.number = 0
        self.object = None

    def action(self):
        '''
        抽象方法:生产方法
        :return:
        '''
        pass

    def action(self,number,object):
        '''
        带参的生产方法:根据数量和对象生产不同的产品
        :param number:生产数量
        :param object:生产产品
        :return:
        '''
        self.number = number
        self.object = object
        while number > 0:
            obj = object()
            list.append(obj)
            number -= 1
        return list

    def __str__(self):
        '''
        生产者的toString方法
        :return:
        '''
        return "生产名称:" self.name "t生产数量:" str(self.number) "t生产对象:" str(self.object)

2、消费者基类(父类)

代码语言:javascript复制
class BaseConsumer(object):
    '''
    消费者
    '''
    def __init__(self,name):
        '''
        初始化消费者对象
        :param name:消费者名称
        '''
        self.name = name

    def action(self,object):
        '''
        消费者消费动作
        :param object:消费物品
        :return:
        '''
        pass

3、根据业务模拟编写生产者消费者

代码语言:javascript复制
import Queue
from base_producer import BaseProducer
from base_consumer import BaseConsumer


class WebProducer(BaseProducer):

    # def __init__(self,name):
    #     self.name = name

    def action(self, number, object):
        '''
        根据数量和对象生产不同的产品
        :param number:生产数量
        :param object:生产产品
        :return:
        '''
        self.number = number
        list = []
        while number > 0:
            obj = object()
            list.append(obj)
            number -= 1
        return list


class WebConsumer(BaseConsumer):

    def __init__(self, name):
        self.name = name

    def action(self, object):
        for i in object:
            # 打印输出生产者
            print(i)


class A():
    '''
    用于测试的具体消费类
    '''
    pass


if __name__ == '__main__':
    # 定义一个队列对象,用于中间缓存
    queue = Queue.Queue()
    # new 一个生产者
    producer = WebProducer("生产者1")
    # 执行生产动作,放回产品列表
    list = producer.action(10, A)
    print(producer.__str__())
    # 把生产的产品放到队列中
    queue.put(list)
    # new 一个消费者
    consumer = WebConsumer("消费者1")
    # 消费者从队列中消费产品
    list = queue.get()
    print(list)
    if None is not list:
        consumer.action(list)
    else:
        print("No producet consumption for the time being!")

4、运行结果

5、总结

其实发布订阅者模式就是生产者消费者模式,

区别在于发布订阅者多了一个中间队列,

生产者生产产品,放到队列中,消费者从队列中取出产品消费。

0 人点赞