JavaScript设计模式-发布订阅模式
什么是发布 — 订阅模式
发布 — 订阅模式,它定义程序对象之间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都将得到通知并执行相应操作。在日常生活中,常见的发布订阅模式有:订阅号,用户关注订阅号,内容创作者在平台发布内容后,平台遍历粉丝列表进行内容推送;销售中介,客户给销售人员留下了客户信息及联系方式,在新产品推出时,挨个给客户打电话进行推销,等等… 而发布订阅模式,一般由三类对象组成:
发布者 Publisher
事件发布者,将需要发布的事件传递给信道中介
信道中介 Event Channel
作为发布订阅的中介,需要缓存相应事件的订阅者列表,在发布者发布时遍历订阅者列表并通知它们
订阅者 Subscriber
订阅事件,并定义事件发布后的操作,向信道中介发起订阅
发布 — 订阅模式的应用
在上面也介绍到了发布订阅模式在日常生活中以及前端开发工作中的使用场景,例如原生 DOM 事件,暴露了订阅接口后,开发者不需要反复查询该事件是否完成;异步编程的请求中,开发者无需轮询 HTTP 请求的状态,可以通过订阅请求的 success、error、u ...
JavaScript设计模式-代理模式
好久不见,怎么这么久没更新了呢?
Emm…最近绩效评估季,绩效总结、360 评估,要写的东西比较多嚯,耽搁了一段时间
废话不多说,迎来 JavaScript 设计模式第三篇:代理模式 ~
代理模式概念
代理模式给某一个对象提供一个代理对象或者占位符,并由代理对象控制原对象的引用,也可以理解为对外暴露的接口并不是原对象。通俗地讲,生活中也有比较常见的代理模式:中介、寄卖、经纪人等等。而这种模式存在的意义在于当访问者与被访问者不方便直接访问/接触的情况下,提供一个替身来处理事务流程,实际访问的是替身,替身将事务做了一些处理/过滤之后,再转交给本体对象以减轻本体对象的负担。
最简代理模式实现
由简入繁
上面了解了代理模式的相关概念,接下来我们用一个最简代理模式的例子实现一下代理模式,从代码中感受代理模式的流程
Talk is Cheap. Show me the code!
client 向服务端发送一个请求
proxy 代理请求转发给服务端
服务端处理请求
const Request = function () {};const client = ...
JavaScript 设计模式 —— 策略模式
很快,迎来了 JavaScript 设计模式系列的第二篇 —— 策略模式 …
什么是策略模式
策略模式定义:
定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换
策略模式一般由两部分组成:
封装不同策略的策略组(使得代码复用性、可扩展、可维护性提高,避免大量 CV 代码的情况)
Context(委托算法,执行策略)
什么时候使用策略模式 ?
策略模式广泛应用于程序研发中,当出现需要根据不同的前置条件执行不同的算法得到结果时,使用策略模式可以让你的代码更加优雅
怎么?不信? 那就上点代码让你感受一下 💩 山的力量!
假设一个函数负责 Consul (服务发现)和 LB (负载均衡)
这里 Consul 函数就是 Context,各种 LB 算法就是策略组
传入服务唯一标识和负载均衡算法
返回服务器实例 IP 地址
如想了解 LB 相关知识,可以看看这篇文章 [深入浅出 LB]手把手带你实现一个负载均衡器
function consul(serviceId, algorithm) { if (algorithm === 'r ...
JavaScript 设计模式 —— 单例模式
在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案 —— 设计模式
设计模式原则:“找出程序中变化的地方,并将变化封装起来”
为什么要学习设计模式?
从事开发岗位也有一年多的时间了,见识过陈年老项目,也从零到一搭建过一个项目。随着项目和业务的不断扩张,写下的代码如果没有进行设计,就渐渐变成了 emm … x 山,怎么写都不对劲,过段时间就想着重构。
人之所以可以走到食物链的顶端,是因为会学习、总结,会使用“名字”和“工具”。而设计模式并不是凭空发明出来的,是经过了大量的项目实践总结出来的对某种业务场景下的程序编写最佳实践,总结出来的解决方案,并给它取了个名字,就变成了一个设计模式。就好比篮球场上的战术,组织后卫常喊出打几号战术,而不是一个人一个人地指挥,简洁的代号往往比冗杂的描述更优雅。有可能你经常写程序的一种方式,可以描述出来,但不知道它叫什么名字,有可能就是一种设计模式。所以我们在学习的过程中,经常会有这种感受: ooooo !!这玩意儿我经常用,经常这么写,原来这个是 xx 模式!
最后,为什么要学设计模式呢?虽然有时候设计模式会使代码复杂度升高,增加开发的成本 ...
摄影 | 梧桐山
机身:SONY A7M2
镜头:SONY 24-70GM
出镜:无
地点:梧桐山
摄影 | 南山夜景
机身: SONY A7M2
镜头: SONY 24-70 GM
出镜: 无
地点: 深圳大南山公园
NodeJS加解密之Crypto
互联网时代,网络上的数据量每天都在以惊人的速度增长。同时,各类网络安全问题层出不穷。在信息安全重要性日益凸显的今天,作为一名开发者,需要加强对安全的认识,并通过技术手段增强服务的安全性。crypto 模块的目的是为了提供通用的加密和哈希算法。用纯 JavaScript 代码实现这些功能不是不可能,但速度会非常慢。Nodejs 用 C/C++实现这些算法后,通过 cypto 这个模块暴露为 JavaScript 接口,这样用起来方便,运行速度也快。
编码方式
为什么信息传输需要编码?
在开发加密解密数据的时候碰到需要把加密好的字节数组转换成 String 对象用于网络传输的需求,如果把字节数组直接转换成 UTF-8 等编码方式的话肯定会存在某些编码没有对应的字符(8bit 只能表示 128 个字符),在编码和解析过程中会出错,不能正确地表达信息。这时就可以通过常用的二进制数据编码方式 Base64 编码或者 Hex 编码来实现。
hex 编码
编码原理
将一个 8 位的字节数据用两个 16 进制数表示出来
将 8 位二进制码重新分组成两个 4 位的字节
其中一个字节的低 4 ...
摄影 | 广州行
机身:IPhone 13 Pro Max
镜头:IPhone 13 Pro Max
出镜:无
地点:广州
带你重新认识Node
最初做Node的目的是什么?
Node作者Ryan Dahl:
基于V8创建一个轻量级的高性能Web服务器并提供一套库
为什么是JavaScript?
Ryan Dahl是一名资深的C/C++程序员,创造出Node之前主要工作是围绕Web高性能服务器进行的
他发现Web高性能服务器的两个要点:
事件驱动
非阻塞I / O
Ryan Dahl也曾评估过使用C、Lua、Haskell、Ruby等语言作为备选实现,得出以下结论:
C的开发门槛高,可以预见不会有太多的开发者能将它用于业务开发
Ryan Dahl觉得自己还不足够玩转Haskell,所以舍弃它
Lua自身已经含有很多阻塞 I / O 库,为其构建非阻塞 I / O 库不能改变开发者使用习惯
Ruby的虚拟机性能不佳
JavaScript的优势:
开发门槛低
在后端领域没有历史包袱
第二次浏览器大战渐渐分出高下,Chrome浏览器的JavaScript引擎V8摘得性能第一的桂冠
Node给JavaScript带来的意义
除了HTML、Webkit和显卡这些UI相关技术没有支持外,Node的结构与Chrome十 ...
[面经分享] 收获多家大厂offer | 分享我的2022秋招经历
前言
好久不见,我是LeBron,有段时间没写博客了。最近几个月的大部分精力都放在秋招上了,边实习边秋招还是挺吃力的,总算结果还是不错。
先介绍一下个人情况:2022届双非本科应届生,项目经验和经历还算丰富,在字节实习至今也快8个月了,详细情况可以来我的博客看看哈 : LeBronChao’s Blog
秋招从7.19 ~ 10.24历时三个多月,腾讯、阿里、字节、百度、大疆、华为、Shopee、滴滴、美团、拼多多10家公司,将近40场笔试 / 面试(自我介绍都快念麻了),基本全部通过收到offer,借此机会做个总结和大家分享一下面经。
面试前的准备
简历
可以参考前端 Offer 提速:如何写出有亮点的简历
这个其实不用讲太多了,尽量地写出亮点,比如
开源项目经验
实习经历 & 重点产出
技术深度展现 / 知名开源框架PR
技术热情 / 影响力
知识产权 / 论文
校园项目经验 / 亮点经历
等等…
重点:Word格式容易出问题 尽量用PDF格式
相应岗位知识
这个其实靠平时积累会比较多一点,面试前可以通过面经做个自测,我面试的大部分是前端岗位主要分为以下几个方面
...