数据结构与设计模式
数据结构与设计模式
考研408
数据结构
数组
链表(双向链表 单向链表)
栈(先进后出)
队列(先进先出)
串(字符串 hash)
图(散链表)
树(平衡树(红黑树--二叉树)、完全平衡二叉树)
计算机组成原理
冯诺依曼
计算机网络
对应的网络组成及相关网络协议
操作系统
Linux涉及到服务器相关指令及操作(center-os)
数据结构及算法
数据存储结构
数组 链表 队列 栈 队列 图 串 树
算法(依靠固定的套路来做相关的解题操作)
递归算法(BFS-广度优先搜索,DFS-深度优先搜索)
动态规划(--思想 解决寻宝 迷宫这类问题)
关于树的算法(完全二叉树里面最小路径的问题) 迪克斯特拉算法
马拉车算法
贪心算法
字符串匹配算法(hash算法)
数组排序算法 (快速排序(数据较少时)、希尔排序(插入数据时)、归并排序(数据量大的时候))
设计模式
概述:设计模式是固定的套路,设计和创建对应的对象(类) 总共23种
设计模式划分
创建型 用来创建对象
结构型 用来加强对应的对象的结构 设计对象结构
行为型 用于对象之前的数据交互和联系建立
开闭 里氏代换 单一职责原则
工厂模式
创建1个工厂,在工厂里生产对应的对象,需要对象的时候调用对应的工厂
function factory (name) {
var obj = new Object() // 先创建对象
obj.name = name // 给对象设置属性
return obj // 再返回这个对象
}
调用
var Person = factory('jack')
单例模式
生产的对象只有1个
使用闭包实现单例
function Person {
}
// 使用闭包实现单例
function Single () {
var instance = null // 保存对应的对象
return function () {
if (instance==null) {
instance = new Person(=)
}
return instance
}
}
// 调用
let singPer = Single()
let person1 = singPer()
let person2 = singPer()
console.log(person1 == person2) // true
使用原型来实现单例(原型声明只有1次)
function Person () {
}
// 利用原型实现
function prototypeSingle () {
let instance = prototypeSingle.prototype.instance
if (!instance) {
// 给原型上的属性赋值
instance = prototypeSingle.prototype.instance = new Person()
}
return instance
}
// 调用
let person3 = prototypeSingle()
let person4 = prototypeSingle()
console.log(person3 == person4) // true
使用静态属性(声明时也只声明1次)
function Person() {
}
function createPerson () {
if (!Person.instance) {
Person.instance = new Person()
}
return Person.instance
}
组合模式
将对应的方法(方法名一致)组合在一起调用
function GoBack () {
this.init = function () {
console.log('回家')
}
}
function OpenPhone () {
this.init = function () {
console.log('打开手机')
}
}
function PlayGame () {
this.init = function () {
console.log('玩游戏')
}
}
class Combiner {
constructor () {
this.args = [] // 接收对应的对象
}
add (obj) { // 将对应的对象存入
this.args.push(obj)
}
excuted () { // 将对应的数组fnName方法执行
this.args.forEach ((item) => {
if (item[fnName]) {
item[fnName]()
}
})
}
}
观察者模式*(发布-订阅者模式)
概述:有第3方的东西在帮你观察对应的内容变化
观察者核心:对应监听内容及处理内容
示例:
我今天去商店叫老板给我1包华子
老板说没有
我和老板说如果有货了联系我
老板告诉我有货了 我买了
以上 老板属于观察者--观察华子有没有 处理--我买了
事件监听就是1个观察者
观察者:js引擎
监听的内容:对应事件 click
处理:事件处理方法(多个)
element.addEventListener("click", function () {
console.log('处理了')
})
观察者 vue2底层
// 对应的观察者 监听函数 处理函数 取消函数
class Observer {
constructor () {
this.message = {} // 装对应事件及对应处理函数 click: [fn1, fn2]
}
// 监听函数 事件名 处理函数
on (type, handler) {
if (!this.message) {
this.message[type] = [handler]
}else {
this.message[type].push(handler)
}
}
// 执行对应的函数
emit (type, ...args) {
// 如果事件不存在 return
if (!this.message[type]) return
// 构建1个event对象 将事件类型及相关参数传递进去
let event = {
type,
args,
}
// 取出事件里的执行方法 执行
this.message[type].forEach(fn => {
fn.call(this, event)
});
}
// 取消对应事件的函数
off (type, handler) {
// 如果事件不存在 return
if (!this.message[type]) return
// 遍历这个对应事件的数组
this.message[type].forEach((fn, index)=>{
if(Object.is(handler, fn)) {
this.message[type].splice(index, 1)
}
})
}
}
var obs = new ObServer()
function fn () {
console.log('hello')
}
function fn2 (e) {
console.log('你好'+ e.args)
}
obs.on('click', fn)
obs.on('click', fn2)
obs.emit('click', 1,2,3)
代理模式 vue3底层
proxy (es7新增对象)
概述:找1个作为你的代理执行人,然后做对应的操作,在不影响原本类结构的情况下做功能加强
代理对象会改变目标对象
示例:
去58同城找1个清洁阿姨帮我打扫家里的卫生
代理: 58同城
目标对象:需要自己去注册1个账号(传递进去)
代理对象:找清洁阿姨(也在58同城有账号)
生成1个对象对象 2个参数 1个是对应目标对象target 对应的代理对象操作handler
let obj = {name: 'jack', age: 18} // 目标对象
// 代理对象
let proxy = new Proxy(obj, {
// 获取值调用get方法
get(target, name, proxy) {
console.log(target[name])
},
// 设置值会调用set方法
set(target, name, value, proxy) {
target[name] = value
},
// 删除调用的方法
deletProperty(target, name){
delete target[name]
},
// in会调用has方法
has(target, name){
}
})
console.log(proxy.name)
proxy.age = 20
console.log(obj)
delete proxy.name
'a' in proxy
装饰模式
功能加强 在不使用继承的情况下 做功能加强
示例:
我有套房子
找个装修队
得到精装
function Car () {
this.run () {
console.log('车在跑')
}
}
//
function ChainCar(car) {
this.run = function () {
console.log("加链子")
car.run()
}
}
var car = new Car()
car.run()
var chainCar = new ChainCar(car)
chainCar.run()

浙公网安备 33010602011771号