数据结构与设计模式

数据结构与设计模式

考研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()
posted @ 2022-07-01 08:55  捧鱼咽  阅读(164)  评论(0)    收藏  举报