zoukankan      html  css  js  c++  java
  • 【编程思想】【设计模式】【其他模式】blackboard

    Python版

    https://github.com/faif/python-patterns/blob/master/other/blackboard.py

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    """
    @author: Eugene Duboviy <eugene.dubovoy@gmail.com> | github.com/duboviy
    
    In Blackboard pattern several specialised sub-systems (knowledge sources)
    assemble their knowledge to build a possibly partial or approximate solution.
    In this way, the sub-systems work together to solve the problem,
    where the solution is the sum of its parts.
    
    https://en.wikipedia.org/wiki/Blackboard_system
    """
    
    import abc
    import random
    
    
    class Blackboard(object):
    
        def __init__(self):
            self.experts = []
            self.common_state = {
                'problems': 0,
                'suggestions': 0,
                'contributions': [],
                'progress': 0   # percentage, if 100 -> task is finished
            }
    
        def add_expert(self, expert):
            self.experts.append(expert)
    
    
    class Controller(object):
    
        def __init__(self, blackboard):
            self.blackboard = blackboard
    
        def run_loop(self):
            while self.blackboard.common_state['progress'] < 100:
                for expert in self.blackboard.experts:
                    if expert.is_eager_to_contribute:
                        expert.contribute()
            return self.blackboard.common_state['contributions']
    
    
    class AbstractExpert(object):
    
        __metaclass__ = abc.ABCMeta
    
        def __init__(self, blackboard):
            self.blackboard = blackboard
    
        @abc.abstractproperty
        def is_eager_to_contribute(self):
            raise NotImplementedError('Must provide implementation in subclass.')
    
        @abc.abstractmethod
        def contribute(self):
            raise NotImplementedError('Must provide implementation in subclass.')
    
    
    class Student(AbstractExpert):
    
        @property
        def is_eager_to_contribute(self):
            return True
    
        def contribute(self):
            self.blackboard.common_state['problems'] += random.randint(1, 10)
            self.blackboard.common_state['suggestions'] += random.randint(1, 10)
            self.blackboard.common_state['contributions'] += [self.__class__.__name__]
            self.blackboard.common_state['progress'] += random.randint(1, 2)
    
    
    class Scientist(AbstractExpert):
    
        @property
        def is_eager_to_contribute(self):
            return random.randint(0, 1)
    
        def contribute(self):
            self.blackboard.common_state['problems'] += random.randint(10, 20)
            self.blackboard.common_state['suggestions'] += random.randint(10, 20)
            self.blackboard.common_state['contributions'] += [self.__class__.__name__]
            self.blackboard.common_state['progress'] += random.randint(10, 30)
    
    
    class Professor(AbstractExpert):
    
        @property
        def is_eager_to_contribute(self):
            return True if self.blackboard.common_state['problems'] > 100 else False
    
        def contribute(self):
            self.blackboard.common_state['problems'] += random.randint(1, 2)
            self.blackboard.common_state['suggestions'] += random.randint(10, 20)
            self.blackboard.common_state['contributions'] += [self.__class__.__name__]
            self.blackboard.common_state['progress'] += random.randint(10, 100)
    
    
    if __name__ == '__main__':
        blackboard = Blackboard()
    
        blackboard.add_expert(Student(blackboard))
        blackboard.add_expert(Scientist(blackboard))
        blackboard.add_expert(Professor(blackboard))
    
        c = Controller(blackboard)
        contributions = c.run_loop()
    
        from pprint import pprint
        pprint(contributions)
    
    ### OUTPUT ###
    # ['Student',
    #  'Student',
    #  'Scientist',
    #  'Student',
    #  'Scientist',
    #  'Student',
    #  'Scientist',
    #  'Student',
    #  'Scientist',
    #  'Student',
    #  'Scientist',
    #  'Professor']
    Python转载版
  • 相关阅读:
    第三周星期三
    第三周星期二
    导入oc动态库(framework)到C++项目中混编出现的问题
    webrtc项目编译报错(image not found)
    OpenGL-综合案例:旋转的大小球
    使用OpenGL来画个甜甜圈
    OpenGL-深度测试和颜色混合
    OpenGL 绘制正方形的基本步骤
    数据结构与算法-基础
    关于iOS离屏渲染的深入研究
  • 原文地址:https://www.cnblogs.com/demonzk/p/9035709.html
Copyright © 2011-2022 走看看