最新要闻
- 重庆警方破获特大制售假冒汽车安全气囊案 涉案金额逾2亿元|天天热文
- 全球速讯:天涯社区已无法打开:网友掀悼念潮
- 《原神》开发商最新力作!米哈游《崩坏:星穹铁道》今日公测 每日报道
- 天天精选!卫星通信首次下放!华为nova 11系列首销:2499元起
- 网传眉山夜市有人偷小孩?警方:男子并非人贩,疑用假币引纠纷 正进一步调查
- 长三角楼市:3月量价齐升
- 1台利润是安卓机10倍!iPhone翻新机全球卖爆:系统不卡 保值好|环球快播报
- 天天观热点:比OLED更香!苹果即将商用MicroLED技术:不烧屏
- 十四届全国人大常委会举行第三次委员长会议,赵乐际主持-环球观天下
- 千元以下投影仪最好别买!原因揭开 世界看热讯
- 【天天新视野】说好一个价,上门又加价——透析搬家等服务收费乱象
- 64核心!京东发布首款ARM云主机:性能飙升60% 还便宜50%-每日热文
- 曝光徐州旅游踩坑网红账号被举报:账号私信已被封
- 领先苹果7年!华为将推出无创血糖监测智能手表:识别率超85%|天天热闻
- 全球焦点!6月上映!《变形金刚7:超能勇士崛起》新海报发布:汽车人集结
- 【环球新要闻】当事人回应吐槽软卧3男1女被狂批:很不高兴 理性一些吧
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【当前独家】JavaScript设计模式
JavaScript设计模式
设计模式概念
经过代码设计经验总结之后设计出的一种固定解决问题的方式
设计模式作用
代码复用
(资料图片仅供参考)
保证代码可靠性
将编程工程化
更易被他人理解
设计模式的分类(W3C平台)
构造器模式,模块化模式,暴露模块模式,单例模式,中介者模式,原型模式,命令模式,外观模式,工厂模式,Mixin模式,装饰模式,亨元(Flyweight)模式,MVC模式,MVP模式,MVVM模式,组合模式,适配器模式,外观模式,观察者模式,迭代器模式,惰性初始模式,代理模式,建造者模式,...
常用设计模式
1. 单例模式
概念 :
多次操作是在同一个实例对象上实现 即第一次为创建实例对象 后面的都是在原有的实例对象上操作
优点 :
节省性能 提升执行速度
function Fn(){ // 这里自定义__obj__是为了防止和Fn内置对象名重叠 if(!Fn.__obj__){ // 这里没有这个对象存在再创建 有则不创建 // 保证单例的核心 Fn.__obj__ = {}; } Fn.__obj__.name = "admin"; return Fn.__obj__; }
2. 工厂模式
概念 :
多次创建多个具有相同属性名相同方法功能的不同实例对象
工厂模式的标志 :
原料(创建基础对象) 加工(给基础对象添加属性或方法) 出厂(将基础对象返回到外部)
优点 :
相互独立 分别控制 互不干扰
function Fn(name, age){ this.name = name; this.age = age } const f1 = new Fn("admin", 18) const f2 = new Fn("root", 19) // 工厂模式和单例模式不同 每次创建的都是新实例对象 console.log(f1 === f2); // false
3. 抽象工厂模式
概念 :
在工厂模式的基础上进行二次封装,将相同的属性值再次封装
// 造车厂 function CreateCar(brand, color, type){ this.brand = brand; this.color = color; this.type = type; } // 专门用来生产比亚迪的生产线 function BYDCar(color, type){ return new CreateCar("比亚迪", color, type); } const b1 = new BYDCar("白色", "SUV"); const b2 = new BYDCar("红色", "轿车"); // 专门用来生产大众的生产线 function WCar(color, type){ return new CreateCar("大众", color, type); } const w1 = new WCar("黑色", "SUV"); const w2 = new WCar("灰色", "轿车");
4. 适配器模式
概念 :
解决两个软件实体间的接口不兼容的问题,对不兼容的部分进行适配
例 : 手机没有3.5耳机插口,所以就需要增加一个转接头来完成适配功能以确保耳机的正常使用
// 创建一个手机构造器 有打电话打游戏功能 function CreatePhone(){ this.name = "手机" this.call = function(){ console.log("打电话") } this.game = function(){ console.log("玩游戏") } } // 创建一个电脑构造器 有游戏功能 function CreateComputer(){ this.name = "电脑" this.game = function(){ console.log("玩游戏") } } // 测试打电话和游戏功能 function test(obj){ obj.call(); obj.game(); } const p = new CreatePhone() const c = new CreateComputer() // 如果没有适配器 电脑因为没有打电话功能test会报错 function Adapter(obj){ // 如果没有这个功能则定义一个这个功能 if(!obj.call){ obj.call = function(){ console.log("这是" + obj.name + "没有打电话功能") } } return obj; } test(p); // 打电话 // 玩游戏 test( Adapter(c) ); // 这是电脑没有打电话功能 // 玩游戏 console.log(p) console.log(c)
5. 代理模式
概念
不直接访问对象 而是提供一个中间对象(代理)来控制对这个对象的访问
生活中也有比较常见的代理模式:中介、寄卖、经纪人等等
// 发送数据方 target为接收方 name为发送方名字 function sender(target, name){ this.name = name; // 定义发送方式 this.send = function(msg){ console.log(this.name + "将" + msg + "交给了" + target.name); } } // 接收数据方 name为接收方名字 function reciver(name){ this.name = name; } // 创建"bob"实例对象用于接收数据 const s = new reciver("bob"); // 定义中间代理 target为接收方 function poster(target){ // 创建发送方实例对象 const f = new sender(s, "tom"); //message用于存储各种数据 this.message = []; this.send = function(msg){ this.message.push({ 发件人: f.name, 收件人: target.name, 物品: msg, 时间: Date.now() }) //调用发送方send方法 msg为传进来参数 f.send(msg); } } // 创建代理实例对象 const k = new poster(s); // 代理发送方tom发送数据给接收方bob k.send("一批教材"); k.send("一批教具"); k.send("一批学生"); console.log(k.message);
6. 观察者模式
又称发布订阅模式(Publish/Subscribe)
概念
观察者模式定义了一种一对多的关系 让一个对象(发布者Dep)能被多个观察者(订阅者Observer)同时监听
优点
- 支持简单的广播通信 自动通知所有订阅者
- 页面载入后发布者很容易与观察者存在一种动态关联 增加了灵活性
- 发布者与观察者之间的抽象耦合关系能够单独扩展以及重用(解耦)
function MyEvent() { // 定义一个对象存储dep和数组形式的observer this.message = {}; // 绑定发布者和目标订阅者 this.binding = function(dep, observer) { if (this.message[dep]) { // 发布者存在 则加入新的订阅者 this.message[dep].push(observer); } else { // 发布者不存在 则创建一个数组 存入第一个订阅者 this.message[dep] = [observer]; } } // 绑定发布者和目标订阅者 this.unbinding = function(dep, observer) { // 发布者不存在 则返回 if (!this.message[dep]) return; // 找到订阅者在数组中的索引 var index = this.message[dep].indexOf(observer); if (index != -1) { // 如果有 则从索引位置删除他 this.message[dep].splice(index, 1); } } // 执行目标发布者的所有订阅者的行为 this.emit = function(dep) { // 发布者不存在 则返回 if (!this.message[dep]) return; // 调用所有订阅者方法 this.message[dep].forEach((val) => {val(dep);}) } } // 创建实例对象 const event = new MyEvent(); // 绑定发布者和订阅者 event.binding("bob", follower1); event.binding("bob", follower2); event.binding("tom", follower1); event.binding("tom", follower2); // 解绑发布者和目标订阅者 event.unbinding("tom", follower1); // 执行目标发布者所有订阅者行为 event.emit("bob"); event.emit("tom"); // 定义订阅者行为 function follower1(dep) { console.log("follower1订阅了" + dep) } function follower2(dep) { console.log("follower2我订阅了" + dep) }
7. 策略模式
概念 :
将多个功能封装起来 定义一系列算法 并使他们能直接相互替换
优点 :
- 利用组合 委托 避免了条件语句
- 使代码更易理解和扩展
- 代码复用
// 需求: 绩效计算 // 条件选择方式 if分支随着绩效分类增多而增多 影响性能 let bonus = function (performance, salary) { if(performance == "S") { return salary * 4; } else if (performance == "A") { return salary * 3; } else if (performance == "B") return salary * 2; } // 策略模式 let calculateBonus = { "S": function ( salary ){ return salary * 4; }, "A": function ( salary ) { return salary * 3; }, "B": function ( salary ) { return salary * 2; } } function calculate(level, salary) { return calculateBonus[level](salary); } console.log(calculate("S", 20000) + "$")
8. MVC模式
全名: Model View Controller 模型 视图 控制器
- M: 模型 按照要求来取出数据
- V: 视图 用户直观看到的页面
- C: 控制器 向系统发出指令的工具
优点
- 降低代码耦合
- 分工合作 提高开发效率
- 组件重用
工作流程
用户的请求提交给控制器
控制器接收到用户请求后根据用户的具体需求 调用相应的程序来处理用户的请求
控制器调用程序处理完数据后 将数据显示出来
// 定义模型 按照要求读取数据 class Model { m1() { return "Model1"; } m2() { return "Model2"; } } // 定义视图 用于数据展示 class View { v1(m) { console.log(m); } v2(m) { document.write(m); } } // 根据控制器找到对应数据 class Control { constructor() { this.m = new Model(); this.v = new View(); } c1() { let value = this.m.m1(); this.v.v1(value); } c2() { let value = this.m.m2(); this.v.v2(value); } } // 创建一个控制器实例对象 const c = new Control(); // 发出指令 c.c1(); c.c2();
9. 组合模式
概念 :
把多个对象组成树状结构来表示局部与整体,使得用户可以同时操作单个对象或对象的组合
优点 :
- 组合模式可以非常方便地描述对象部分-整体层次结构
- 组合模式将一批子对象组织为树形结构 一条根命令能操作下面所有子元素
// // 枝 class Team { constructor(id) { // 组合模式核心之一 使得每个元素都能保存自己所有的子元素 this.children = []; this.ele = document.createElement("div"); this.ele.id = id; } add(child) { // 在数组中加入child元素 this.children.push(child); // 将child添加到当前实例对象对应元素(this.ele)中 this.ele.appendChild(child.ele); } remove(child) { // 找到这个child元素在数组中索引 let c = this.children.indexOf(child); // 根据索引删除元素 this.children.splice(c, 1); // child为实例对象 找到实例对象对应元素 并删除节点元素 child.ele.remove(); } addBorder() { // 给当前实例对象对应元素添加边框 this.ele.style.border = "2px solid black"; // 以下递归和核心之一 // 给当前实例对象children数组(保存所有子元素对应实例对象)中所有元素也添加边框 如果子实例对象对应实例对象中还有实例对象则递归进去 重复之前步骤 直到所有子孙元素 this.children.forEach(val => {val.addBorder()}); } removeBorder() { // 给当前实例对象对应元素删除边框 this.ele.style.border = "none"; // 原理同addBorder this.children.forEach(val => {val.removeBorder()}); } } // 叶 class Item { constructor(src) { // 此处ele为核心之一 这里的ele必须和上面枝中的ele相同 如果不同 this.ele在递归到叶中实例对象时 因找不到ele元素而报错而报错 this.ele = document.createElement("img"); this.ele.src = src; } add() { console.log("此为叶节点 不能添加"); } remove() { console.log("此为叶节点 不能删除"); } addBorder() { // 叶没有子元素 所以只要给自己添加边框 this.ele.style.border = "2px solid red"; } removeBorder() { // 叶没有子元素 所以只要给自己删除边框 this.ele.style.border = "none"; } } // 创建叶实例对象 const img1 = new Item("https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF"); const img2 = new Item("https://t7.baidu.com/it/u=4198287529,2774471735&fm=193&f=GIF"); const img3 = new Item("https://t7.baidu.com/it/u=2511982910,2454873241&fm=193&f=GIF"); const img4 = new Item("https://t7.baidu.com/it/u=3435942975,1552946865&fm=193&f=GIF"); // 创建枝对象 const box1 = new Team("box1"); const box2 = new Team("box2"); const box3 = new Team("box3"); const box4 = new Team("box4"); const box5 = new Team("box5"); // 将盒子 和 img组合 box1.add(box2); box1.add(box3); box3.add(box4); box4.add(box5); box1.add(img1); box4.add(img2); box4.add(img3); box5.add(img3); // 以下为box在body中排列 // box1 // box2 // box3 // box4 // box5 // img3 // img2 // img3 // img1 // 将根box1添加到body中 document.body.appendChild(box1.ele); // 给元素添加删除边框 box1.addBorder(); box3.addBorder(); img2.removeBorder();
关键词:
-
每日速读!Pipelines
用于执行高性能的I O,且代码不复杂依赖库:System IO Pipelines创建varpipe=newPipe();PipeReaderreader=pipe Reader
来源: 【当前独家】JavaScript设计模式
每日速读!Pipelines
Spring Boot 项目代码混淆,实战来了,再也不用担心代码泄露了!
重庆警方破获特大制售假冒汽车安全气囊案 涉案金额逾2亿元|天天热文
世界即时:*ST蓝盾股债或被双双强退 蓝盾转债或成第一只退市可转债
【财经分析】山东高速、湖北科投两单REITs获批 常态化发行进入快车道
中大盘蓝筹股成调研重点 热点企业AI业务受机构关注
全球速讯:天涯社区已无法打开:网友掀悼念潮
《原神》开发商最新力作!米哈游《崩坏:星穹铁道》今日公测 每日报道
天天精选!卫星通信首次下放!华为nova 11系列首销:2499元起
网传眉山夜市有人偷小孩?警方:男子并非人贩,疑用假币引纠纷 正进一步调查
速看:百亿级新投资项目此起彼伏 光伏头部企业加速“垂直一体化”布局
【国际大宗商品早报】经济衰退担忧回升 原油基本金属全线下跌
长三角楼市:3月量价齐升
1台利润是安卓机10倍!iPhone翻新机全球卖爆:系统不卡 保值好|环球快播报
天天观热点:比OLED更香!苹果即将商用MicroLED技术:不烧屏
学系统集成项目管理工程师(中项)系列12_干系人管理-焦点消息
十四届全国人大常委会举行第三次委员长会议,赵乐际主持-环球观天下
千元以下投影仪最好别买!原因揭开 世界看热讯
fastbin_tcache 环球热闻
【天天新视野】说好一个价,上门又加价——透析搬家等服务收费乱象
64核心!京东发布首款ARM云主机:性能飙升60% 还便宜50%-每日热文
曝光徐州旅游踩坑网红账号被举报:账号私信已被封
领先苹果7年!华为将推出无创血糖监测智能手表:识别率超85%|天天热闻
全球焦点!6月上映!《变形金刚7:超能勇士崛起》新海报发布:汽车人集结
【环球新要闻】当事人回应吐槽软卧3男1女被狂批:很不高兴 理性一些吧
【环球新要闻】国际锐评丨“先开枪,再开口”美国陷入了怎样的怪圈?
打印机测试页打印不出来(打印机测试页) 当前时讯
环球时讯:C语言程序设计知识点总结02
clion使用 wsl 编译下, 文件名和目录名冲突问题|全球即时
铁矿石主力合约跌破700关口_天天微速讯
被千万粉网红曝光 徐州通报出租车违规营运处理情况:司机罚款1000元
特斯拉再获中东大户订单:以后出租车全是Model 3/Y?_全球即时
对话黑芝麻智能CEO:芯片公司 错两次可能就死了 环球时快讯
世界看点:为了地球 希捷一年翻新116万块硬盘:减少540吨垃圾
世界视讯!图论之存图
07.存储引擎
中诚信国际:终止启迪环境科技发展公司主体及相关债项信用等级
足球6步过人方法 环球今日报
当前头条:关于时间管理的一点建议
热消息:07 内存(中)实现内存页面初始化
【新华解读】两个新准则实施有望进一步推动保险公司高质量发展_天天资讯
2023中国医学装备展览会在重庆开幕-焦点日报
环球动态:玩家称赞《死亡岛2》画面优秀:那《GTA6》会是啥样?
暗黑4容量要求翻倍:至少90GB SSD 比魔兽18年积累还多
北大学生因差评被逼写检讨?电影《惊天救援》辟谣:不实传闻|当前热议
【世界热闻】龙源电力(00916)公布一季度业绩 归属公司权益持有人净利润为24.18亿元 同比增长7.09%
Django之路由层 (有名和无名分组 反向解析 路由分发 名称空间)_环球观速讯
资讯:分析查询语句:EXPLAIN
上海数据交易所迎来国际板
天天播报:注意!泰福泵业将于5月23日召开股东大会
人与动物和谐共处!大爷水中游泳:天降白鹭搭便车
国产操作系统UOS新版预告 全面支持Intel 13代酷睿:性能飞跃提升
世界速讯:ChatGPT:一个里程碑!
冲出黎明前的黑暗:国产芯不再当备胎-环球时讯
海外玩家疯狂期待国产大作《黑神话:悟空》:金箍棒充满神秘力量
分享总结:开源网关-应用管理篇
KMP算法学习笔记
记录-因为写不出拖拽移动效果,我恶补了一下Dom中的各种距离
每日资讯:【谷歌插件开发】获取当前网站COOKIE并上报HTTP-API
Java中为什么重写equals()也需要重写hashCode()?
抖音小店运营没有头绪?一定要掌握这些技巧!全篇详解! 当前简讯
债市日报:4月25日_环球消息
芒果TV五一狂促:会员年卡3折年内新低 仅79元
我国小行星防御首次任务计划公布:2030年对小行星动能撞击 世界播报
还买啥RTX 4070 AMD铁了心降价:16GB显存RX 6950 XT只要4749元_世界头条
豆瓣评分高达9.0!《灌篮高手》遭遇史上最严重盗摄|速读
热点评!别急着升级!火狐浏览器112稳定版出内存泄露Bug
in fear(fearitself)|全球聚焦
遵义12岁失联女孩被找到,一细节披露令人不解,嫌疑人已被抓获
世纪天鸿涨停 三个交易日机构净买入1.41亿元
国产武侠开放世界沙盒生存游戏 《侠乂行:浪迹天涯》预售:128元 环球快资讯
男子高速要求停车上厕所被拒后跳车 专家科普:极其危险 环球要闻
今日报丨铭瑄RTX 4070 iCraft OC12G瑷珈显卡评测:专为2K高画质而生 DLSS 3畅享百帧光追
天天微速讯:比亚迪盘活腾势!全新猎跑SUV腾势N7盲订7天订单破万
1亿像素仅1399元 荣耀X50i开箱图赏 世界今亮点
三年来北京为3万余名务工人员追发工资5.11亿元-世界速看料
06 内存(上)划分与组织内存-天天简讯
乌合之众再次上演,打工人将被AI一键淘汰?
谈谈持续集成,持续交付,持续部署之间的区别
记录一则ADG备库报错ORA-29771的案例|天天观速讯
全球热消息:数字孪生与元宇宙:虚拟与现实的奇妙对话
恒生指数25日收跌1.71% 互联网科技股集体走低 最资讯
山东海化: 关于会计政策变更的独立意见|焦点简讯
不怕打岔!微信推出“最近阅读”:近期阅读文章一键查
腾讯携手Unity:推出定制化实时导航3D地图|天天热消息
金属马达+双滚珠轴承!酷冷至尊莫比乌斯120 OC风扇图赏|快播报
吉林长春现实版“虎口拔牙” 医生:从业20多年首次
焦点热议:拒还3亿退款!暴雪回应被网易起诉:目前未收到诉状
4月25日涨停板复盘:中科曙光涨停 中国科传11天7板
Java中不同对象调用该实例方法返回值是同一个地址空间吗?|天天最资讯
天天观焦点:Sftp工具类(跨服务器传输)
MySQL 备忘清单_开发速查表分享
头条:使用Dockerfile部署springboot打包jar包
【天天新要闻】仿Django框架-基于wsgiref模块和jinja2模块写一个简单的框架 主流框架简介 动静态网页 Python虚拟环境
火热征集中!全国城市生活垃圾分类标识征集大赛邀你来参与-世界新消息
收评:创指跌1.83%创近半年来新低 锂电池产业链跌幅靠前 天天热点
当前短讯!【财经分析】供应收缩叠加需求前景有望改善 原油止跌反弹
大气!蔚来宣布五一期间所有车主高速免费换电:不限次
47个楼盘2块钱甩卖!恒大汽车:只为专注造车