设计模式

中介者模式

喜夏-厌秋 提交于 2021-02-18 10:50:45
1.1 中介者 1.1.1 定义 中介者模式 (Mediator Pattern) 也称为调解者模式或调停者模式,Mediator 本身就有调停者和调解者的意思。在日常生活中调停者或调解者这个角色我们见得比较多的是 ”和事佬“,也就是说调解两个有争端的人的角色。中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用,从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用,保证这些作用可以彼此独立变化。中介者模式将多对多的相互作用转化为一对多的相互作用,将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。 1.1.2 角色 UML Mediator: 抽象中介者角色,定义了同事对象到中介者对象的接口,一般以抽象类的方式实现。 ConcreteMediator: 具体中介者角色,继承于抽象中介者,实现了父类定义的方法,它从具体的同事对象接收消息,向具体同事对象发出命令。 Colleague: 抽象同事类角色,定义了中介者对象的接口,它只知道中介者而不知道其它的同事对象。 ConcreteColleagueA/B: 具体同事类角色,继承于抽象同事类,每个具体同事类都知道本身在小范围内的行为,而不知道它在大范围内的目的。 1.1.3 代码 public class Demo { public static

Python3网络爬虫(一):利用urllib进行简单的网页抓取

拈花ヽ惹草 提交于 2021-02-18 08:00:01
点击 蓝色字 免费订阅, 每天收到这样的好信息 前言 : 最近有不少粉丝关注本公众号。并且我已经 成功开通了流量主同时会赚一点点广告费,我打算每个月把这部分钱拿出来给大家买点书刊,算是给大家一点福利吧。大家想买什么书扫描下方的加他拉你加群。最后,非常感谢大家的关注。 运行平台:Windows Python版本:Python3.x IDE:Sublime text3 转载请注明作者和出处: http://blog.csdn.net/c406495762/article/details/58716886 一直想学习Python爬虫的知识,在网上搜索了一下,大部分都是基于Python2.x的。因此打算写一个Python3.x的爬虫笔记,以便后续回顾,欢迎一起交流、共同进步。 一、预备知识 1.Python3.x基础知识学习: 可以在通过如下方式进行学习: (1)廖雪峰Python3教程(文档): URL:http://www.liaoxuefeng.com/ (2)菜鸟教程Python3教程(文档): URL:http://www.runoob.com/python3/python3-tutorial.html (3)鱼C工作室Python教程(视频): 小甲鱼老师很厉害,讲课风格幽默诙谐,如果时间充裕可以考虑看视频。 URL:http://www.fishc.com/ 2.开发环境搭建

你真的懂CAP吗?

人盡茶涼 提交于 2021-02-18 07:37:10
想写这个是源于微信群里面的一个讨论。在讨论分布式系统的时候,有群友明确地如下说: CAP是可以兼顾的啊! 这把我惊起了一身冷汗,赶紧去查了一下是不是分布式系统理论界又有新的论文来推翻了之前的CAP定理了。后来深入讨论以后,才发现是他对CAP的理解有误。 CAP理论是分布式领域的基础,所以大家的讨论和研究很多。学界和工业界也想出来好多办法来折中处理不可兼得时候的情形,例如著名的“BASE"。但是诸如上面的“CAP可以兼顾”的话是绝对不应该出现的。如果能证明这点并且能写出学术文章的话,那是肯定能发 PODC 并且成为学术大牛的。而现阶段的研究没有一个往着打破CAP定理的方向走,这说明CAP定理挺牢固的,只是因为“BASE”的存在而产生好像兼顾了的误解。那么,为了帮助大家更好的理解CAP及其应用呢,借此机会,我来试着写篇文章讨论一下这方面的内容,并且争取能通过实践将其表达的更加清楚。 CAP定理到底是什么 以下定义摘自维基百科: 在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点: 一致性(Consistency) (等同于所有节点访问同一份最新的数据副本) 可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据) 分区容错性

读者暖冬福利【30本】前端书籍,免费送送送!

本秂侑毒 提交于 2021-02-18 00:05:24
总听身边的朋友抱怨,抽奖送书数量太少,总是不中奖,这次,我们联合图灵社区,送出 30本 前端技术书籍,涵盖CSS、JS、算法与数据结构、Node.js、设计模式等等。 一旦中奖,个人将独享 两本 ,书籍可在以下列表中任意挑选 ,书池如下: 抽奖形式: 本次抽奖采用助力形式,每扫码关注一个公众号, 即可增加一次助力, 扫码10个, 回复消息“ 1212 ”, 中奖概率翻 10 倍 。取消关注任意一个公众号,中奖后将不予兑奖,每人最多可获得两本图书。此次活动给大家预留了充足的助力时间,赶快邀请小伙伴来免费拿书吧。 2020年的锦鲤,就是你了。 活动时间:2020.12.12--2020.12.18 开奖方式:自动开奖 开奖时间:2020.12.18 20:30 前端人 👆长按二维码进行关注👆 回复: 1212 获取抽奖码 程序员哆啦A梦 👆长按二维码进行关注👆 回复: 1212 获取抽奖码 秋风的笔记 👆长按二维码进行关注👆 回复: 1212 获取抽奖码 搜狐技术产品 👆长按二维码进行关注👆 回复: 1212 获取抽奖码 前端印象 👆长按二维码进行关注👆 回复: 1212 获取抽奖码 前端达人 👆长按二维码进行关注👆 回复: 1212 获取抽奖码 前端壹栈 👆长按二维码进行关注👆 回复: 1212 获取抽奖码 前端进阶指南 👆长按二维码进行关注👆 回复: 1212 获取抽奖码

“一次编码、到处运行”,淘宝云端一体化探索

我的未来我决定 提交于 2021-02-17 22:54:44
作者|孙棋(空蒙) 出品|阿里巴巴新零售淘系技术部 导读:当前移动互联网业务研发运维模式,云与多端互相割裂,有些全栈的探索缺乏成功案例,行业对云端一体化研发这块仍是空白,我们要思考: 如何能实现 1 个研发支撑云 + android + iOS 三端的业务快速落地。 是否有新的研发运维模式,让程序员回归程序,“一次编码、到处运行”是我们的答案。我们在闲鱼项目验证,原本 60 天的项目时间减少了 20 天,提效 33% 。希望本文的分析也能够给大家带来收获。 业务研发模式的演进 效率是业务研发运维模式演进核心驱动力 PC 互联网时代,单体应用包含前后端是最初的研发模式(淘宝经历开发人员写 velocity 模板,以及更早的 jsp、asp 页面)其实质是中心化搭火车的研发模型。 随着业务发展复杂性快速增加,赶火车的交付模式,极大的限制了业务发展,因此诞生了服务化的拆分,淘宝在 09 年的五彩石项目即基于这样的背景,微服务是一种软件架构,这背后更是一种研发模式的变革,从中心化研发模式到分布式的研发模式升级。 在业务分布式研发模式升级的同时,前后端分离研发模式也在同步的演进,从 ajax 到专业前端独立完成业务闭环,职业分工细化提效。但对前端同学而言,服务端的运维始终是其痛苦的技术门槛,以及在阿里以 Java 语言为基础的中间件生态内,一直没有很好解决。 进入移动互联网时代

常问的22道Java面试题,值得收藏【文末送书】

微笑、不失礼 提交于 2021-02-17 20:41:58
作者:爱茹一婉年 原文: https : //blog.csdn.net/qq_21924011/article/details/80399836 1)集合类:List和Set比较,各自的子类比较(ArrayList,Vector,LinkedList;HashSet,TreeSet) List:元素是有顺序的,元素可以重复因为每个元素有自己的角标(索引) |-- ArrayList:底层是数组结构,特点是:查询很快,增删稍微慢点,线程不同步:A线程将元素放在索引0位置,CPU调度线程A停止,B运行,也将元素放在索引0位置,当A和B同时运行的时候Size就编程了2. |-- LinkedList:底层使用的是链表数据结构,特点是:增删很快,查询慢。线程不安全,线程安全问题是由多个线程同时写或同时读写同一个资源造成的。 |--Vector:底层是数组数据结构,线程同步,Vector的方法前面加了synchronized关键字,被ArrayList代替了,现在用的只有他的枚举。 Set:元素是无序的,且不可以重复(存入和取出的顺序不一定一致),线程不同步。set底层是使用Map实现的,故可以通过ConcurrentHashMap的方式变通实现线程安全的Set。 |--HashSet:底层是哈希表数据结构。根据hashCode和equals方法来确定元素的唯一性。

Python爬虫入门教程 妹子图网站爬取

喜你入骨 提交于 2021-02-17 14:42:51
妹子图网站----前言 从今天开始就要撸起袖子,直接写Python爬虫了,学习语言最好的办法就是有目的的进行,所以,接下来我将用10+篇的博客,写 爬图片 这一件事情。希望可以做好。 为了写好爬虫,我们需要准备一个火狐浏览器,还需要准备抓包工具,抓包工具,我使用的是CentOS自带的tcpdump,加上wireshark ,这两款软件的安装和使用,建议你还是学习一下,后面我们应该会用到。 妹子图网站---- 网络请求模块requests Python中的大量开源的模块使得编码变的特别简单,我们写爬虫第一个要了解的模块就是requests。 妹子图网站---- 安装requests 打开终端:使用命令 pip3 install requests 等待安装完毕即可使用 接下来在终端中键入如下命令 # mkdir demo # cd demo # touch down.py 上面的linux命令是 创建一个名称为 demo 的文件夹,之后创建一个 down.py 文件,你也可以使用GUI工具,像操作windows一样,右键创建各种文件。 为了提高在linux上的开发效率,我们需要安装一个 visual studio code 的开发工具 对于怎么安装vscode,参考官方的https://code.visualstudio.com... 有详细的说明。 对于centos则如下: sudo

Scrum与看板区别

放肆的年华 提交于 2021-02-17 12:28:00
看板:在制品(work-in-progress, WIP)必须被限制 WIP上限和拉动式生产 1. Scrum与看板简述 Scrum:组织拆分,工作拆分,开发时间拆分,优化发布计划,过程优化 看板:流程可视化,限制WIP,度量生产周期 2. Scrum和看板的关系 Scrum和看板都是过程工具 Scrum和看板只是给了一些明确的约束和指导,比如,Scrum的约束是固定时长的迭代和跨功能团队,看板的约束是要有可见的看板,队列大小要有约束 敏捷方法也被称作轻量级方法 3. Scrum规定了角色 Scrum规定了三种角色:PO/Team/SM,看板没规定任何角色 4. Scrum规定了固定时长的迭代 Scrum的迭代混合了三种活动:计划/过程改进/发布 5. Scrum按迭代限制WIP,看板按流程状态限制WIP 6. Scrum与看板都是经验主义,需要自省/反馈/调整 7. Scrum在迭代期间内拒绝变化 看板的原则是“一件出去,一件进来”,响应时间等于手头事情的处理时间 Scrum的平均响应实践等于sprint长度的一半 8. 关于任务规模 Scrum团队只承诺一个迭代内能完成的任务,如果任务太大会进行拆分 看板对任务规模没有明确规定必须要在某个时间段做完 9. Scrum规定了估算和生产率,看板没有规定估算 有的团队跳过估算,把每个任务拆分得大小接近,统计每周完成的特性数

顶级程序员和普通程序员在思维模式上的5个区别!

浪尽此生 提交于 2021-02-17 04:09:30
《The Effective Engineer》的作者在写书的过程中,为了了解那些顶级程序员和普通程序员的区别,采访了很多硅谷顶级科技公司的顶尖软件工程师。他发现这些给世界带来巨大影响的的工程师们至少有以下5个共同的思维模式: 1. 勇于去研究你不懂的代码 一般人都不愿意去研究自己不曾接触过的代码,很多人都没有尝试就放弃了。如果你经常去研究你没有接触过的代码,你就会越来越熟悉不同的代码结构和设计模式。现在人们很容易就接触到优秀的开源代码资源,你可以很方便的就下载下来做一些改动或者调试,去研究为什么代码可以这么写。 除了代码之外,很多人对于陌生的工作内容也会感到恐惧。每次换工作的时候,你可能都会遇到新公司的工作内容和以前工作的内容不一样的情况,以至于刚开始的时候工作效率没有以前那么高。很多人甚至觉得,他们是不是骗了面试官。 其实,大家都是在学习的过程中。在一个陌生的领域,没有人从一开始就是大神。如果你想变得越来越好,无论是写代码,与人沟通或者其它的技能,都是需要投入时间去学习的。 2. 精通代码调试(debug) 很多人在写代码的过程中,经常会有的一个问题就是:为什么我写出来的代码不能运行?为什么运行的结果不是我想要的? 几乎所有的程序员写代码都不是一遍就能写好的。但是顶尖的程序员非常快的就明白自己代码的问题可能是什么。这是一个很重要的能力,但是偏偏学校里不教

我的FP感悟

自作多情 提交于 2021-02-16 23:20:42
FP概要: 我主要总结了以下5点: 函数是一等公民: 函数的参数是函数,返回值是函数,类型还是函数... 舍弃语句,拥抱表达式: 表达式就一定有返回值。 无副作用: 不修改外部系统的状态。 immutable: 没有变量,一切不可变,循环用递归实现。 引用透明: 相同输入产生相同输出,需要的信息都通过参数传递,方便单元测试. 就以上几点,我编了一首打油诗: 函数编程很强大 一等公民都是它 外部变量不依赖 返回确保串行化 串行化什么意思呢? 同样计算 (1+2)*3/4 ,java代码如下: int a = 1 + 2 int b = a * 3 int c = b / 4 而Scala写出来如下: val r = subtract(multiply(add(1, 2), 3), 4) 如此,就可以很简单的改写为: val r = add(1, 2).multiply(3).subtract(4) 其中的美妙自己体会吧~~~ 那么这么做的意义呢? 代码简洁 接近自然语言 函数单纯,易于测试 immutable,并发简单可控 热升级 如果代码包含了任何的var,则是指令式风格,如果全是val则可能是函数式风格。 函数的结果类型是Unit的是有副作用的,而结果类型有明确返回类型的则可能是没有副作用的。 函数内部依赖外部数据而不是输入参数(也就是闭包)的是有副作用的,