设计模式手册之装饰者模式
1. 什么是“装饰者模式”?
装饰者模式:在不改变对象自身的基础上,动态地添加功能代码。
根据描述,装饰者显然比继承等方式更灵活,而且不污染原来的代码,代码逻辑松耦合。
2. 应用场景装饰者模式由于松耦合,多用于一开始不确定对象的功能、或者对象功能经常变动的时候。尤其是在参数检查、参数拦截等场景。
3. 代码实现3.1 ES6 实现ES6 的装饰器语法规范只是在“提案阶段”,而且不能装饰普通函数或者箭头函数。
下面的代码,addDecorator可以为指定函数增加装饰器。
其中,装饰器的触发可以在函数运行之前,也可以在函数运行之后。
注意:装饰器需要保存函数的运行结果,并且返回。
1234567891011121314151617181920212223242526272829303132333435363738const addDecorator = (fn, before, after) => { let isFn = (fn) => typeof fn === 'function' if (!isFn(fn)) { ...
设计模式手册之责任链模式
1. 什么是“责任链模式”?
责任链模式:多个对象均有机会处理请求,从而解除发送者和接受者之间的耦合关系。这些对象连接成为链式结构,每个节点转发请求,直到有对象处理请求为止。
其核心就是:请求者不必知道是谁哪个节点对象处理的请求。如果当前不符合终止条件,那么把请求转发给下一个节点处理。
而当需求具有“传递”的性质时(代码中其中一种体现就是:多个if、else if、else if、else嵌套),就可以考虑将每个分支拆分成一个节点对象,拼接成为责任链。
2. 优点与代价
优点
可以根据需求变动,任意向责任链中添加 / 删除节点对象
没有固定的“开始节点”,可以从任意节点开始
代价:责任链最大的代价就是每个节点带来的多余消耗。当责任链过长,很多节点只有传递的作用,而不是真正地处理逻辑。
3. 代码实现为了方便演示,模拟常见的“日志打印”场景。模拟了 3 种级别的日志输出:
LogHandler: 普通日志
WarnHandler:警告日志
ErrorHandler:错误日志
首先我们会构造“责任链”:LogHandler -> WarnHandl ...
设计模式手册之享元模式
1. 什么是“享元模式”?
享元模式:运用共享技术来减少创建对象的数量,从而减少内存占用、提高性能。
享元模式提醒我们将一个对象的属性划分为内部和外部状态。
内部状态:可以被对象集合共享,通常不会改变
外部状态:根据应用场景经常改变
享元模式是利用时间换取空间的优化模式。
2. 应用场景享元模式虽然名字听起来比较高深,但是实际使用非常容易:只要是需要大量创建重复的类的代码块,均可以使用享元模式抽离内部/外部状态,减少重复类的创建。
为了显示它的强大,下面的代码是简单地实现了大家耳熟能详的“对象池”,以彰显这种设计模式的魅力。
3. 代码实现这里利用python和javascript实现了一个“通用对象池”类–ObjectPool。这个类管理一个装载空闲对象的数组,如果外部需要一个对象,直接从对象池中获取,而不是通过new操作。
对象池可以大量减少重复创建相同的对象,从而节省了系统内存,提高运行效率。
为了形象说明“享元模式”在“对象池”实现和应用,特别准备了模拟了File类,并且模拟了“文件下载”操作。
通过阅读下方代码可以发现:**对于File类,内部状态是pool属性和d ...
设计模式手册之组合模式
1. 什么是“组合模式”?
组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。
用小的子对象构造更大的父对象,而这些子对象也由更小的子对象构成
单个对象和组合对象对于用户暴露的接口具有一致性,而同种接口不同表现形式亦体现了多态性
2. 应用场景组合模式可以在需要针对“树形结构”进行操作的应用中使用,例如扫描文件夹、渲染网站导航结构等等。
3. 代码实现这里用代码模拟文件扫描功能,封装了File和Folder两个类。在组合模式下,用户可以向Folder类嵌套File或者Folder来模拟真实的“文件目录”的树结构。
同时,两个类都对外提供了scan接口,File下的scan是扫描文件,Folder下的scan是调用子文件夹和子文件的scan方法。整个过程采用的是深度优先。
3.1 python3 实现12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849class File: # 文件类 def __init__(self, name): ...
Linux命令分类合集
下面罗列出来的都是常用命令,若想查询更多 ➡️:https://man.linuxde.net/
1.系统信息12345678910111213141516171819arch #显示机器的处理器架构(1)uname -m #显示机器的处理器架构(2)uname -r #显示正在使用的内核版本dmidecode -q #显示硬件系统部件 - (SMBIOS / DMI)hdparm -i /dev/hda #罗列一个磁盘的架构特性hdparm -tT /dev/sda #在磁盘上执行测试性读取操作cat /proc/cpuinfo #显示CPU info的信息cat /proc/interrupts #示中断cat /proc/meminfo #校验内存使用cat /proc/swaps #显示哪些swap被使用cat /proc/version #显示内核的版本cat /proc/net/d ...
设计模式手册之命令模式
1. 什么是“命令模式”?
命令模式是一种数据驱动的设计模式,它属于行为型模式。
请求以命令的形式包裹在对象中,并传给调用对象。
调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象。
该对象执行命令。
在这三步骤中,分别有 3 个不同的主体:发送者、传递者和执行者。在实现过程中,需要特别关注。
2. 应用场景有时候需要向某些对象发送请求,但是又不知道请求的接受者是谁,更不知道被请求的操作是什么。此时,命令模式就是以一种松耦合的方式来设计程序。
3. 代码实现3.1 python3 实现命令对象将动作的接收者设置在属性中,并且对外暴露了execute接口(按照习惯约定)。
在其他类设置命令并且执行命令的时候,只需要按照约定调用Command对象的execute()即可。到底是谁接受命令,并且怎么执行命令,都交给Command对象来处理!
123456789101112131415161718192021222324252627282930313233343536373839__author__ = 'godbmw.com'# 接受到命令,执行具体操 ...
Web安全与防护
1. SQL 注入1.1 介绍例如做一个系统的登录界面,输入用户名和密码,提交之后,后端直接拿到数据就拼接 SQL 语句去查询数据库。如果在输入时进行了恶意的 SQL 拼装,那么最后生成的 SQL 就会有问题。
比如后端拼接的 SQL 字符串是:
1SELECT * FROM user WHERE username = 'user' AND password = 'pwd';
如果不做任何防护,直接拼接前端的字符,就会出现问题。比如前端传来的user字段是以'#结尾,password随意:
1SELECT * FROM user WHERE username = 'user'#'AND password = 'pwd';
密码验证部分直接被注释掉了。
1.2 防范后端应该对于字符串有转义,可以借助成熟的库的 API 来拼接命令,而不是自己手动拼接。
2. XSS:跨站脚本攻击2.1 介绍原理上就是黑客通过某种方式(发布文章、发布评论等)将一段特定的 JS 代码隐蔽地输入进去。然后别人再 ...
浏览器常见考点
1. 加载页面和渲染过程
题目:浏览器从加载页面到渲染页面的过程。
① 加载过程
要点如下:
DNS服务器解析域名的IP地址
建立TCP握手连接
向IP指向的服务器发送HTTP请求
服务器收到、处理并返回HTTP请求
浏览器获取返回内容
② 渲染过程
要点如下:
根据HTML代码生成DOM树
根据CSS生成CSSDOM
将 DOM 树和 CSSOM 整合成 RenderTree
根据 RenderTree 开始渲染和展示
遇到<script>,会阻塞渲染
这个过程要注意<link>标签位置,以及<script>标签位置和HTML提供的async defer属性
2. 渲染线程和 JS 引擎线程浏览器中常见的线程有:渲染线程、JS 引擎线程、HTTP 线程等等。
例如,当我们打开一个 Ajax 请求的时候,就启动了一个 HTTP 线程。
同样地,我们可以用线程的只是解释:为什么直接操作 DOM 会变慢,性能损耗更大?因为 JS 引擎线程和渲染线程是互斥的。而直接操作 DOM 就会涉及到两个线程互斥之间的通信,所以开销更大。
除此之外,这还能解 ...
设计模式手册之订阅-发布模式
1. 什么是“订阅-发布模式”?
订阅-发布模式定义了对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都可以得到通知。
了解过事件机制或者函数式编程的朋友,应该会体会到“订阅-发布模式”所带来的“时间解耦”和“空间解耦”的优点。借助函数式编程中闭包和回调的概念,可以很优雅地实现这种设计模式。
2. “订阅-发布模式” vs 观察者模式订阅-发布模式和观察者模式概念相似,但在订阅-发布模式中,订阅者和发布者之间多了一层中间件:一个被抽象出来的信息调度中心。
但其实没有必要太深究 2 者区别,因为《Head First 设计模式》这本经典书都写了:发布+订阅=观察者模式。其核心思想是状态改变和发布通知。在此基础上,根据语言特性,进行实现即可。
3. 代码实现3.1 python3 实现python 中我们定义一个事件类Event, 并且为它提供 事件监听函数、(事件完成后)触发函数,以及事件移除函数。任何类都可以通过继承这个通用事件类,来实现“订阅-发布”功能。
1234567891011121314151617181920212223242526272829 ...
README.md
设计模式分类1、创建型模式:创建对象的模式,抽象了实例化的过程。
2、结构型模式:解决怎样组装现有对象,设计交互方式,从而达到实现一定的功能目的。例如,以封装为目的的适配器和桥接,以扩展性为目的的代理、装饰器。
3、行为型模式:描述多个类或对象怎样交互以及怎样分配职责。