【编程思想】【设计模式】【其他模式】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转载版
【编程思想】【设计模式】【其他模式】blackboard的更多相关文章
- 面向对象编程思想(前传)--你必须知道的javascript
在写面向对象编程思想-设计模式中的js部分的时候发现很多基础知识不了解的话,是很难真正理解和读懂js面向对象的代码.为此,在这里先快速补上.然后继续我们的面向对象编程思想-设计模式. 什么是鸭子类型 ...
- 面向对象编程思想(前传)--你必须知道的javascript(转载)
原文地址:http://www.cnblogs.com/zhaopei/p/6623460.html阅读目录 什么是鸭子类型 javascript的面向对象 封装 继承 多态 原型 this指向 ...
- Java编程思想重点笔记(Java开发必看)
Java编程思想重点笔记(Java开发必看) Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...
- PHP设计模式-策略模式 转
策略模式(Strategy Pattern) 策略模式是对象的行为模式,用意是对一组算法的封装.动态的选择需要的算法并使用. 策略模式指的是程序中涉及决策控制的一种模式.策略模式功能非常强大,因为这个 ...
- .NET设计模式: 工厂模式
.NET设计模式: 工厂模式(转) 转自:http://www.cnblogs.com/bit-sand/archive/2008/01/25/1053207.html .NET设计模式(1): ...
- 面向对象编程思想(OOP)
本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞 ...
- java编程思想
Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理 ...
- 设计模式 --迭代器模式(Iterator)
能够游走于聚合内的每一个元素,同时还可以提供多种不同的遍历方式. 基本概念: 就是提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示. 使用迭代器模式的优点: 遍历集合或者数 ...
- Java编程思想总结笔记The first chapter
总觉得书中太啰嗦,看完总结后方便日后回忆,本想偷懒网上找别人的总结,无奈找不到好的,只好自食其力,尽量总结得最好. 第一章 对象导论 看到对象导论觉得这本书 目录: 1.1 抽象过程1.2 每个对象 ...
- javascript设计模式——组合模式
前面的话 在程序设计中,有一些和“事物是由相似的子事物构成”类似的思想.组合模式就是用小的子对象来构建更大的对象,而这些小的子对象本身也许是由更小的“孙对象”构成的.本文将详细介绍组合模式 宏命令 宏 ...
随机推荐
- 流媒体技术的应用,如何搭建一个SimpleNVR流媒体服务系统
Onvif/RTSP流媒体服务 SimpleNVR Onvif/RTSP流媒体服务是一款软硬一体音视频流媒体服务软件.它是在5G.AI.云计算.大数据.物联网等网络技术大规模商用后,用户要求视频随时随 ...
- Java后台常用方法(更新中)
String字符串 API文档地址:中文 英文 String类在java.lang包中,java使用String类创建字符串变量,字符串变量属于对象. String类对象创建后不能修改,String变 ...
- 关于 better-scroll 设置了以后无法滚动或不生效的问题
首先在mounted里面注册组件 例:let scroll = new BScroll("#commondityLeftList") 然后打印实例化对象,例:console. ...
- 在 Node.js 中处理大 JSON 文件
在 Node.js 中处理大 JSON 文件 场景描述 问题一: 假设现在有一个场景,有一个大的 JSON 文件,需要读取每一条数据经过处理之后输出到一个文件或生成报表数据,怎么能够流式的每次读取一条 ...
- FZU ICPC 2020 寒假训练 6 —— 字符串处理
P1603 斯诺登的密码 题目描述 2013年X月X日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机.但是,这件事情太不周密了,因为FBI的间谍早已获悉他的具体位置--但这不是最重要的 ...
- Django笔记&教程 4-3 模型(models)主键外键
Django 自学笔记兼学习教程第4章第3节--模型(models)主键外键 点击查看教程总目录 参考:https://docs.djangoproject.com/en/2.2/ref/models ...
- [hdu6145]Arithmetic of Bomb II
对于题中的"normal expression"(仅含加减乘和无前导0的非负整数,无括号)的计算,实际上并不需要通常的表达式求值,而可以用下述方式计算-- 维护三元组$(a,b,c ...
- 如何删除一个win10的服务
使用场景: 之前电脑玩腾讯qq微端游戏,后来卸载残留服务一直在后台占用系统资源.那么如何关闭这个服务呢. 1.首先 管理员运行--cmd.exe 2.打开任务管理器,找到服务名称,如果服务开启可以关闭 ...
- [源码解析] PyTorch 分布式(12) ----- DistributedDataParallel 之 前向传播
[源码解析] PyTorch 分布式(12) ----- DistributedDataParallel 之 前向传播 目录 [源码解析] PyTorch 分布式(12) ----- Distribu ...
- Elasticsearch分布式搜索和数据分析引擎-ElasticStack(上)v7.14.0
Elasticsearch概述 **本人博客网站 **IT小神 www.itxiaoshen.com Elasticsearch官网地址 https://www.elastic.co/cn/elast ...