设计模式

创建型设计模式对比总结 设计模式(八)

血红的双手。 提交于 2021-02-11 12:54:08
创建型模式是new 的一种替代方式,可以将对象的创建与具体的类型进行分离 目前已经介绍了5种创建型设计模式(如果简单工厂算一种的话,那就是6种) 分别是: 简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式 简单工厂模式 静态工厂方法是一种最简单的创建的替代方法 基本上不涉及复杂的处理过程,可能执行的仅仅是包装、转换等 比如,一个静态方法,根据参数进行if else判断,或者switch选择进而确定需要创建的对象类型 比如,Long内部的valueOf 接受不同类型的参数,进而转换为Long类型对象 他可以是一个方法,也可以有多个静态方法 尽管通常简单工厂模式将只会创建一种类型的产品对象 但是,你也可以N个静态方法,创建N多种不同类型的对象 不过一般不这么用,不够清晰,没有条理杂乱,完全不符合单一职责原则 所以对于简单工厂模式,我们一般说简单工厂模式只能创建一种类型的产品 简单工厂模式它的核心就是: 一个类 静态方法 来解决对象的创建问题 一个类吃遍天下 工厂方法模式 简单工厂模式一个类吃遍天下,职责过多,就会有各种原因可能要修改这个类,好比你是两个班级的班主任,不管哪个班级的学生有事情都要找你。 既不符合单一职责原则,也不符合开闭原则 所以为了解决这个问题,进化出来工厂方法模式 工厂方法模式不再是一个类吃遍天下

Linux文本编辑器vim

风格不统一 提交于 2021-02-11 12:53:23
目录 1、vim 的工作模式 2、插入命令 3、定位命令 4、删除命令 5、复制和剪切命令 6、替换和取消命令 7、搜索和搜索替换命令 8、保存和退出命令 9、vim 高级操作 10、总结   通过前面几篇博客我们终于结束了Linux常用命令的介绍,Linux常用命令主要包括以下:   ①、 Linux文件和目录处理命令   ②、 Linux链接命令和权限管理命令   ③、 Linux文件搜索命令   ④、 Linux帮助和用户管理命令   ⑤、 Linux压缩和解压缩命令   ⑥、 Linux网络和关机重启命令   学习命令,我们不需要记住每一条命令的详细语法格式,学完之后我们只需要知道某个命令能干什么。这样我们在实际应用中,遇到需要实现某个功能,我们脑海只要能想起来适用于某个命令就行,至于详细格式我们可以通过查资料。当我们使用的多了,会不知不觉的记住这些命令,这才是正确的学习方法。Linux命令有很多,如果初学者就想全部记住这些命令的详细格式,会对我们产生很大的学习挫败性,还没记完这些命令,或许你已经丧失了学习Linux的热情了。   结束了Linux常用命令的学习,接下来我们学习Linux最常用的文本编辑器命令 vim。其实最开始Linux系统的文本编辑器命令是 vi,后来出现了一个 vi 的增强版 vim,所以实际操作中我们还是使用增强版 vim。 回到顶部 1、vim

捋一捋JavaScript创建对象

99封情书 提交于 2021-02-11 08:26:10
创建对象 回顾前面我们谈到通过object构造函数创建单个对象 // 创建一个object的实例,然后再为它添加属性和方法 var person = new Object(); person.name = "jill"; person.age = 18; person.job = "software Engineer"; person.sayName = function () { alert(this.name); } 通过对象字面量创建单个对象 var person = { name:"jill", age:18, job:"software Engineer", sayName:function () { alert(this.name); } } 通过object构造函数或对象字面量创建单个对象的方式有个缺点: 使用同一个接口创建很多对象,会产生大量的重复代码 工厂模式 解决了创建多个相似对象的问题 function createPerson(name,age,job) { var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function () { alert(this.name); } return o; } var person1 = createPerson(

三步法解析Axios源码

血红的双手。 提交于 2021-02-11 01:39:13
关注公众号“执鸢者”,回复“红宝书”获取大量前端学习资料。 一、领悟思想 Axios是一个基于Promise的HTTP库,根据官网介绍,有以下几个特点: 在浏览器端会创建XMLHttpRequests 在Node端会创建HTTP请求 由于Axios是一个基于Promise的HTTP库,所以其支持Promise API 支持请求和响应拦截器 支持请求和响应数据转换 支持取消请求 自动转换JSON数据 客户端支持防御XSRF攻击 通过上述官网介绍的特点,我认为其突出的优点有三个: 支持Promise API,可以方便进行链式调用; 支持请求和响应拦截器,该拦截器将Node中中间件思想引入该库,在请求发送之前和响应接收之后可以对其进行处理。 支持数据转换器,转换器主要负责数据发送前以及响应接收后对数据的处理。 二、把握设计 理解了该库设计的特点,下面从源码目录、抽象接口及核心设计原理三个层面对Axios进行整体的把握。 2.1 源码目录 如下所示是Axios的源码目录及各个文件的作用 2.2 抽象接口 对源码的目录有了一定了解,下面利用UML类图对该系统各个模块的依赖关系进一步了解,为后续源码分析打好基础。(看该图注意对着源码一起看) 2.3 设计原理 首先看一段代码,这段代码的执行顺序包含着Axios的核心原理。 axios.defaults.baseURL = 'http:/

Java职业生涯规划

送分小仙女□ 提交于 2021-02-10 23:02:29
java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍。这一部分的内容,同样适用于一些希望转行到Java的同学。   在大家看之前,我要先声明两点。1、由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和Java后端开发的同学请适当参考其学习思想即可,切勿照搬。2、下面对于【第一部分】的推荐内容,目的是让你尽快成为一个可以参加工作的Java开发者,更适用于处于待业状态,准备转行Java的同学。 第一部分:基础 对于尚未做过Java工作的同学,包括一些在校生以及刚准备转行Java的同学。 一、Java基础首先去找一个Java的基础教程学一下,推荐《Java编程思想》。学习Java基础的时候,应该尽量多动手,很多时候,你想当然的事情,等你写出来运行一下,你就会发现不是这么回事儿,不信你就试试。学完以上内容以后,你应该对Java有一个基本的了解了,你可以用Java语言写出一些简单的程序,并且你用的是最简单的编辑器,比如记事本。这个时候,不要急于进入下一部分,留下几天好好写一些程序,尽可能熟悉这些基础内容。 二、Web开发等你写上几天程序以后

什么是redis的缓存雪崩与缓存穿透

一曲冷凌霜 提交于 2021-02-10 13:20:40
今天来分享一下Redis几道常见的面试题: 如何解决缓存雪崩? 如何解决缓存穿透? 如何保证缓存与数据库双写时一致的问题? 一、缓存雪崩 1.1 什么是缓存雪崩? 首先我们先来回答一下我们为什么要用缓存(Redis): 1、提高性能能:缓存查询是纯内存访问,而硬盘是磁盘访问,因此缓存查询速度比数据库查询速度快 2、提高并发能力:缓存分组了部分请求,支持更高的并发 现在有个问题, 如果我们的缓存挂掉了,这意味着我们的全部请求都跑去数据库了 。 我们都知道Redis不可能把所有的数据都缓存起来( 内存昂贵且有限 ),所以Redis需要对数据设置过期时间,将已经过期的键值对删除,它采用的是惰性删除+定期删除两种策略对过期键删除。 如果缓存数据 设置的过期时间是相同 的,并且Redis恰好将这部分数据全部删光了。这就会导致在这段时间内,这些缓存 同时失效 ,全部请求到数据库中。 这就是缓存雪崩 : Redis挂掉了,请求全部走数据库。 对缓存数据设置相同的过期时间,导致某段时间内缓存失效,请求全部走数据库。 缓存雪崩如果发生了,很可能就把我们的数据库 搞垮 ,导致整个服务瘫痪! 1.2 如何解决缓存雪崩? 对于“对缓存数据设置相同的过期时间,导致某段时间内缓存失效,请求全部走数据库。”这种情况,非常好解决: 解决方法:在缓存的时候给过期时间加上一个 随机值 ,这样就会大幅度的

Linux-vim文本编辑器

烈酒焚心 提交于 2021-02-10 10:04:25
【Vim文本编辑器】   vim的三种模式:一般模式、编辑模式、命令模式。   * 一般模式: 当你vim filename 编辑一个文件时,一进入该文件就是一般模式了。在这个模式下,你可以做的操作有,上下移动光标;删除某个字符;删除某行;复制、粘贴一行或者多行。   * 编辑模式:一般模式下,是不可以修改某一个字符的,只能到编辑模式了。从一般模式进入编辑模式,只需你按一个键即可(i,I,a,A,o,O,r,R)。当进入编辑模式时,会在屏幕的最下一行出现“INSERT或REPLACE”的字样。从编辑模式回到一般模式只需要按一下键盘左上方的ESC键即可。   * 命令模式:在一般模式下,输入”:”或者”/”即可进入命令模式。在该模式下,你可以搜索某个字符或者字符串,也可以保存、替换、退出、显示行号等等。   下面教你如何在一个空白文档中写入一段文字,然后保存。    输入vim test.txt直接回车进入一般模式。然后按"i" 字母进入编辑模式   会看到窗口的左下方出现”INSERT”字样,说明已经进入了编辑模式,此时就可以写入内容了。    等编辑完内容后,按ESC退出编辑模式,进入一般模式。此时在左下方的”INSERT”字样消失,然后按”:”进入命令模式,最后输入wq保存并退出vim。   这时,看一下test.txt文档的内容吧。   其实vim为全键盘操作的编辑器

【CSS】343- CSS Grid 网格布局入门

爱⌒轻易说出口 提交于 2021-02-10 08:10:31
CSS Grid(网格) 布局使我们能够比以往任何时候都可以更灵活构建和控制自定义网格。Grid(网格) 布局使我们能够将网页分成具有简单属性的行和列。 它还能使我们在不改变任何HTML的情况下,使用 CSS 来定位和调整网格内的每个元素。它允许 HTML 纯粹作为内容的容器。 HTML 结构不再受限于样式表现,比如不要为了实现某种布局而多次嵌套,现在这些都可以让 CSS 来完成。 定义一个网格 Grid(网格) 模块为 display 属性提供了一个新的值: grid 。当你将任何元素的 display 属性设置为 grid 时,那么这个元素就是一个 网格容器(grid container),它的所有直接子元素就成了 网格项(grid items)。 让我们创建创建一个 3×3 的布局,做一个 Tic-Tac-Toe (井字游戏) 棋盘。首先,我们将写一些 HTML: HTML 代码: <div class = "game-board" > < div class = "box" > </ div > <div class = "box" > </ div > <div class = "box" > </ div > <div class = "box" > </ div > <div class = "box" > </ div > <div class = "box" >

ArrayList(JDK1.8)源码解析

孤街醉人 提交于 2021-02-10 05:14:24
既然是看源码,那我们要怎么看一个类的源码呢?这里我推荐的方法是: 1)看继承结构 看这个类的层次结构,处于一个什么位置,可以在自己心里有个大概的了解。 2)看构造方法 在构造方法中,看做了哪些事情,跟踪方法中里面的方法。 3)看常用的方法 跟构造方法一样,这个方法实现功能是如何实现的 注:既然是源码,为什么要这样设计类,有这样的继承关系。这就要说到设计模式的问题了。所以我们要了解常用的设计模式,才能更深刻的去理解这个类。 简介 ArrayList 是 Java 集合框架中 List 接口的一个实现类。底层是数组,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。 ArrayList是Vector的翻版,区别在于ArrayList是线程不安全的,而Vector则是线程安全的。但是Vector是一个较老的集合,具有很多缺点,不建议使用,这里我们就不对其进行分析了。 ArrayList 可以说是我们使用最多的 List 集合,它有以下特点: 它是基于数组实现的List类 可以动态地调整容量 有序的(元素输出顺序与输入顺序一致) 元素可以为 null 不同步,非线程安全,效率高 查询快,增删慢 占用空间更小,对比 LinkedList,不用占用额外空间维护链表结构 ArrayList 为什么有这些优点呢?我们通过源码来分析分析。在阅读源码前先来看看ArrayList继承关系。

程序的可维护性和可扩展性

允我心安 提交于 2021-02-10 04:33:40
可维护性是指当需要修改程序的某个模块时,对其他模块的影响和修改的代价;可扩展性是指当需要为程序添加新的功能时,对其他模块的影响和添加的代价,可以从下面几个方面提高程序的可维护性和可扩展性 代码风格: 1. 命名规范 命名要能传递出变量或者方法的含义,少用缩写 私有成员以m开头,静态成员以s开头,常量用大写字母等 2. 代码排版 留出合理的空白空间来区分不同的代码块 同类的变量的声明要放在一组,不同类变量之间留出一行空白等 3. 关键注释 仅为关键的代码添加注释 代码的层次性: 对于一段业务逻辑,不要试图在一个方法或者一个类中去全部实现,而要将它分成几个子逻辑,然后让每个子逻辑做自己的事情;当代码的层次性出来以后,就可以做到单一职责了 面向拓展编程: 在写程序的过程中要时刻考虑到扩展 设计模式: 恰当地使用设计模式可以提高代码的可维护性和可扩展性 什么是可维护、可复用、可扩展、灵活性 代码完成之后,如果要修改部分功能,需要修改的地方很少,就是容易维护 代码完成之后,以后开发中可以复用部分代码,提高效率,就是复用性强 代码完成之后,要在原来的基础上增加新功能,只需要添加添加该功能的代码,不需要修改原来的代码(对之前的代码没有影响),这就是可扩展 代码完成之后,使用的地方可以通过多种方式来调用该部分的代码,这就是灵活性好 来源: oschina 链接: https://my