基于JS的设计模式01(kerwin老师笔记)

【纯血鸿蒙】安装hdc工具 参考资料: 阅读详情

封装变化是核心,变化的部分灵活,不变的部分稳定,不是所有的问题都可以用到现有的设计模式。

1.构造器模式

// 有几个就需要创建几个,太麻烦了
        var employee1 ={
            name:'kerwin',
            age:100
        }
        var employee2 ={
            name:'tiechui',
            age:18
        }
// 构造一个函数,需要几个自己new
        function Employee(name,age){
            this.name = name
            this.age = age

            // 自身带的方法
            this.say = function(){
                console.log("Hello")
            }
        }
        var employee1 = new Employee("kerwin",100)
        employee1.say();

有点Java面向对象的感觉了,抽象构造出属性和方法,然后具体去实例化。

但构造器模式有缺点,每次new的时候都要重新申请内存,但是这些都是相似的东西,重复申请内存不太好。函数的原型是唯一的。

2.原型模式(对构造器的补充)

// 把方法放到原型上
        function Employee(name,age){
            this.name = name
            this.age = age
        }
        employee.prototype.say = function(){
                console.log("Hello")
            }

再用ES6中类的方法创建

 class Employee{
                constructor(name,age){
                    this.name = name
                    this.age = age
                }
                // 这个方法就直接挂到原型上
                say(){
                    console.log("Hello")
                }
            }
            var employee1 = new Employee("kerwin",100)

3.工厂模式

由一个工厂对象决定创建某一种产品对象类的示例,主要用来创建同一类对象。

// 权限系统,映射不同角色进来之后的页面
        function User(role,pages){
            this.role = role
            this.pages = pages
        }
        // 生产User的工厂
        function UserFatory(role){
            switch(role){
                case "superadmin":User
                  return new User("superadmin",["home","user-manage","right-manage","news-manage"])
                break;
                case "admin":User
                  return new User("admin",["home","user-manage","news-manage"])
                break;
                case "editor":User
                  return new User("editor",["home","news-manage"]) 
                break;
                default:
                    throw new Error("参数错误")
            }
        }
        // 这样做白占内存
        // new User("superadmin",["home","user-manage","right-manage","news-manage"])
        // new User("admin",["home","user-manage","news-manage"])
        // new User("editor",["home","news-manage"])   

用ES6改造一下 

 class User {
            constructor(role,pages){
            this.role = role
            this.pages = pages
            }
            // ES6的静态方法
            static UserFatory(role){
              switch(role){
                case "superadmin":User
                  return new User("superadmin",["home","user-manage","right-manage","news-manage"])
                break;
                case "admin":User
                  return new User("admin",["home","user-manage","news-manage"])
                break;
                case "editor":User
                  return new User("editor",["home","news-manage"]) 
                break;
                default:
                    throw new Error("参数错误")
            }
        }    
        } 
        var User = User.UserFatory('editor') 

简单工厂的优点,你只需要一个正确的参数,就可以获取你所需要的对象,但对象不能太多,不能太复杂,不然就难以维护了。

4.抽象工厂模式

抽象工厂模式并不直接生成实例,而是用于对产品类族的创建,继承衍生,覆盖重写基本的类。

        class superadmin extends User{
            constructor(name){
                super(name,"superadmin",["home","user-manage","right-manage","news-manage"])
            }
            dataShow(){
                // 方法重写
                console.log('superadmin-dataShow')
            }
            addRight(){

            }
            addUser(){

            }
        }
        class admin extends User{
            constructor(name){
                super(name,"admin",["home","user-manage","news-manage"])
            }
            dataShow(){
                // 方法重写
                console.log('admin-dataShow')
            }
        }

        function getAbstractUserFactory(role){
            // 返回你需要的类
            switch(role){
                case "SuperAdmin":
                    return superadmin
                    break;
                case "Admin":
                    return Admin
                    break;
                default:
                    throw new Error("参数错误")
            }
        } 

5.建造者模式

工厂模式要的是结果,建造者模式关注的是内部的每一个细节。

class Navbar{
            init(){
                console.log("navbar-init")
            }
            getData(){
                console.log("navbar-getdata")
            }
            render(){
                console.log("navbar-render")
            }
        }
        class lsit{
            init(){
                console.log("lsit-init")
            }
            getData(){
                console.log("lsit-getdata")
            }
            render(){
                console.log("lsit-render")
            }
        }
        // 在这里进行具体的逻辑处理
        class Creator{
            startBulid(builder){
                builder.init()
                builder.getData()
                builder.render()
            }
        }
        // 有问题的话我们只需要改这里
        // class Creator{
        //     async startBulid(builder){
        //         await builder.init()
        //         await builder.getData()
        //         await builder.render()
        //     }
        // }
        const op = new Creator()
        op.startBulid(new Navbar())
        op.startBulid(new lsit())

6.单例模式

保证一个类仅有一个实例,提供一个访问它的全局访问点,主要解决一个全局使用的类频繁的创建和销毁占用内存。长时间不动,对话框提醒重新登录

// 自执行函数,返回函数就是闭包了
        var Singeton = (function(){
            var instance
            function User(name,age){
                this.name = name
                this.age = age
            }
            return function(name,age){
                if(!instance){
                    // 创建实例
                    instance = new User(name,age)
                }
                return instance
            }
        })()
        // 重复执行多次,结果一致,永远是当时的那个,永远不会被垃圾回收
        
        // ES6写法
        class Singeton{
            constructor(name,age){
                if(!Singeton.instance){
                    this.name = name
                    this.age = age
                    Singeton.instance = this
                }
                return Singeton.instance
            }
        }
        // 只要页面不刷新永远是之前的那个

全局store的概念就是单例模式的应用;

7.装饰器模式

对已有功能进行扩展,减少对原业务的影响

YOLOv8与注意力机制融合:EMA(高效多维注意力)的原理剖析与实战应用 本文介绍了如何在YOLOv8目标检测模型中集成EMA(高效多尺度注意力)机制。主要内容包括:EMA注意力机制的工作原理解析,展示其多尺度特征融合和高效计算特性;详细的环境配置与依赖安装指南;EMA模块的完整代码实现,包含分组处理、空间注意力权重计算和特征融合等关键步骤;以及将EMA集成到YOLOv8网络结构的方法。通过添加EMA模块,可以提升模型对关键特征的关注能力,有效抑制背景干扰,从而增强目标检测性能。本教程提供了从原理到实现的完整解决方案。 阅读详情

相关推荐

宝骏kiwi 630 730 560 E100 E200 E300 310 510 610 330 530维修手册电路图资料线路图接线图更新

2020-2022年宝骏RS-3维修手册和电路图。2020-2022年宝骏RS-3维修手册和电路图。2019-2021年宝骏RC-6维修手册和电路图。2019-2021年宝骏RC-6维修手册和电路图。2019-2020年宝骏RS-5维修手册和电路图。2019-2020年宝骏RS-5维修手册和电路图。2019-2020年宝骏RM-5维修手册和电路图。2019-2020年宝骏RM-5维修手册和电路图。2019-2021年宝骏510维修手册和电路图。2019-2021年宝骏510维修手册和电路图。

weixin_45821055的博客 1771

ES6笔记(kerwin老师)

ES6特性

m0_67880202的博客 679

足球赛事数据API:开发者生存指南(附真实踩坑记录)

作为一个既爱看球又爱写代码的老宅男,我这些年用过的足球API比看过的比赛还多。从最初被各种API文档折磨到怀疑人生,到现在能闭着眼睛调接口,中间的血泪史够写本书了。今天就把这些经验(和教训)分享给各位同好,特别是那些正在为"老板要做个足球App"而秃头的同行们。文档清晰免费层可用响应格式规范API-Sports免费额度大方支持GraphQL有中文文档(难得!Sportmonks数据全面有Webhook支持按需付费。

Happy0970的博客 2197

前端笔记-JavaScript部分(中)

特性解构赋值扩展运算符主要用途从数据结构中提取值组合/复制数据结构工作对象数组和对象数组和对象是否改变原数据否否常见场景函数参数提取、模块导入数组合并、对象浅拷贝、函数传参默认值支持支持不支持重命名支持支持(对象)不支持嵌套结构处理支持浅拷贝。

MrsBaek的博客 1041

OpenBCI脑电数据处理实战:用MNE库从Raw对象到可视化分析全流程

本文提供了使用MNE-Python库处理OpenBCI脑电数据的完整实战指南。从通过BrainFlow库获取原始数据流、创建核心的Raw对象,到进行工频滤波、带通滤波等关键预处理步骤,最后实现时域信号、功率谱密度及地形图等多种专业可视化分析,手把手教你完成脑机接口数据处理的全流程。

gin88的博客 370

谷粒商城篇章9 ---- P248-P261/P292-P294 ---- 消息队列【分布式高级篇六】

RabbitMQ消息队列、RabbitMQ延时队列。

weixin_48568302的博客 1550

node.js笔记(千锋kerwin老师同款)

node.js笔记,需要可联系我

weixin_63298816的博客 2264

【PCIe】CDNS PCIe VIP 杂记 -- Callback

最近在研究Cadence PCIe VIP,怎一个“惨淡”来描述。用的真是一言难尽啊,都是泪。记录一些最近学习的觉得想记录的内容在此,仅供参考讨论学习哈。有不对之处请指出大家一起讨论。

小邦是名小ICer的博客 2716

千锋教育JavaScript视频教程笔记

B站视频对应链接 首推这个老师的JavaScript课程,讲的很棒!!!! 文章目录 首推这个老师的JavaScript课程,讲的很棒!!!! JavaScript (最全)基础+项目前言1.计...

程序员小明1024 373

PCL Alpha Shapes平面点云边界特征提取【2026最新版】

alpha shapes算法用于平面点云的边界特征提取。博客长期更新,本文最近一次更新时间为:2026年4月20日。

点云侠的博客 27万+

基于Simulink建模仿真的滑模控制的磁悬浮轴承稳定控制仿真

磁悬浮轴承(Magnetic Bearing)利用电磁力来支撑和定位转子,无需机械接触,因此在高速旋转设备中具有广泛应用。滑模控制(Sliding Mode Control, SMC)是一种鲁棒性强的非线性控制方法,适用于磁悬浮轴承的精确控制。以下是基于Simulink的磁悬浮轴承滑模控制系统的详细设计与仿真步骤。通过上述步骤,设计并实现了基于 Simulink 和 Control System Toolbox 的磁悬浮轴承滑模控制系统。

MHD0815的博客 780

Vue3开发与实战 千峰教育kerwin老师笔记

Vue3开发与实战

陈二狗的博客 2088

ROS从入门到精通2-7:Gazebo仿真之动态生成障碍物

动态生成障碍物在机器人导航、碰撞避障算法测试、多机协同等领域应用广泛,可以帮助开发人员快速测试,本文介绍该技术并提供基于ROS Gazebo的实现

FRIGIDWINTER的博客 4899

JavaScript基础

一、JavaScript介绍 1.JavaScript历史 布兰登 艾奇 1995年在网景公司 发明的JavaScript 2. JavaScript与ECMAScript ECMA是“European Computer Manufacturers Association”的缩写,中文名称为欧洲计算机制造商协会 它组织定制了当时出了JavaScript以外的多门语言标准,这个标准就叫ECMAScr...

Kerwin_YF的博客 1357

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JavaScript定时器及回调用法

JavaScript定时器及回调用法 循环定时任务 // 假设现在有这样一个需求:我需要请求一个接口,根据返回结果判断需不需要重复请求,直到达到某一条件为止,停止请求执行某操作 <script type="text/javascript"> var timer; var index = 0; function tim(){ timer = se...

Kerwin的博客 1960

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

怎样设计一个好架构:八个评价维度、四层思考深度,以及 23 种设计模式各自解决什么问题

架构要解决的是变化、理解、故障和协作的成本。本文从耦合、可迁移、可适配、复杂度等八个维度讲怎么评价架构,讲维度之间怎么取舍、架构思考可以分几层,再用可编译的 C 代码过一遍 23 种设计模式。

weixin_52400878的博客 337

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

访问者模式详解

汇总目录请点击访问:《设计模式目录汇总》 喜欢内容的话欢迎关注、点赞、收藏!感谢支持,祝大家祉猷并茂,顺遂无虞!

2601_96797912的博客 24

设计模式之状态模式

状态模式是一种行为型设计模式,通过将对象的不同状态行为封装到独立的状态类中,使上下文对象在状态变化时自动切换行为。以外卖订单为例,不同状态(如待支付、配送中)对同一操作(如取消)有不同响应。状态模式避免了复杂的if/else判断,提升代码可维护性与扩展性。其核心由上下文(Order)、状态接口(OrderState)和具体状态类组成,通过委托机制实现状态间的平滑切换。

FallingGod的博客 302

Agent Skill 五大设计模式:从工程实践到落地指南

Skill 不是一段临时 Prompt,而是一个可复用、可测试、可迭代的任务流程模板。通常通过SKILL.mdWhen:什么情况下触发How:按什么步骤执行What:最终输出什么:哪些行为必须遵守、哪些行为禁止fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;用户意图Skill 路由工具调用 / MCP / API结构化输出检查与交付。

m0_62458145的博客 220

设计模式之策略模式

策略模式是一种行为型设计模式,将可互换的算法封装为独立策略,使客户端可在运行时动态选择并切换算法。核心由策略接口、具体策略和上下文三部分组成。通过将算法与使用分离,实现解耦与灵活扩展。适用于多算法场景,如支付方式、排序策略等,避免冗长的if/else。

FallingGod的博客 404

设计模式(unity游戏研发版)

当你使用图形用户界面类时通常会遇到一个问题。比如,你创建了自定义按钮类并允许客户端在按钮中注入自定义代码,这样当用户按下按钮时就会触发这些代码。观察者模式允许任何实现了订阅者接口的对象订阅发布者对象的事件通知。你可在按钮中添加订阅机制,允许客户端通过自定义订阅类注入自定义代码。在Unity中,这就像UnityEvent在Inspector中绑定多个回调。

m0_63330263的博客 107

设计模式指南 (Java 版)

设计模式是解决软件设计中常见问题的可复用方案,而非直接代码。本文以最简方式梳理三大类设计模式:创建型(如单例、工厂方法)、结构型(如适配器、装饰器)和行为型(如观察者、策略)。通过生活化类比与Java示例,强调“按需使用、避免过度设计”的原则,帮助理解其核心思想与实际应用。

sync_with_U 240

设计模式与生活⑬:你坐几号线,谁来运营是另一回事

一到周五,小王的心情就会好一点。倒不是工作少了,而是想到这一天忙完,后面接着双休,心里就有盼头。地铁上,他抬头看标识,发现一件平时没留意的事:5 号线、10 号线常见的是“北京地铁”,4 号线却写着“京港地铁”。再想想,北京的机场也各有各的名字:首都机场、大兴机场。可在成都坐地铁,日常看到的统一称谓就是“成都地铁”。都是出行,名称和背后的主体并不完全一样。对乘客来说,常做的事还是那几样:查线路、进站、上车、到站下车。坐几号线是一条信息,谁来运营是另一条信息,不必揉成一团。同样是在北京坐地铁,线路和运营方并不

工一木子 242

【第四部分:Agentic 智能体设计模式】18.Agent 并行化实战:任务拆分、并发执行与结果汇总

本文介绍 Parallelization(并行化模式)的原理与工程实现,重点分析 Fan-out / Fan-in、Sectioning、Voting、任务依赖、上下文隔离、并发控制及部分失败处理。结合采购合同并行分析案例与 Java CompletableFuture 代码,说明如何实现独立任务的并发执行、结构化结果汇总和证据校验。同时介绍 LangGraph 动态任务分发、OpenAI 并行 Subagent、LangChain 异步 Subagent 及 DeepSeek Super-agent 等近

weixin_42258782的博客 247

设计模式与生活⑭:一栋楼,共用一份热

今天是立冬。天气预报说夜里有暴雪,白天最高也就 4 度。早上起来,屋里比外面强不了多少。窗玻璃上蒙着一层水汽,摸一把暖气片,凉的。物业群里发了通知:今天开始试供暖,暖气片会慢慢热起来,顶层记得排气,边户留意自家热不热。隔了会儿再摸,暖气片上热下凉,温温的,不烫手。再晚一点,整间屋子总算有了点热乎气。一天里最踏实的一件事,是知道这栋楼里不只自己一户在等热。热力站烧的是一锅水,顺着管网送到每家,各家只管拧自己那个阀门。试供暖第一天,暖气片温而不烫今天聊的。

工一木子 364

设计模式之访问者模式

访问者模式是一种行为型设计模式,核心思想是将操作从元素类中分离,通过“访问者”统一管理对对象结构的多种操作。适用于元素类型稳定但操作频繁变化的场景。其精髓在于双重分派:元素通过accept方法触发访问者visit,最终由元素和访问者的运行时类型共同决定具体执行逻辑。该模式避免了在元素类中添加大量方法,提升扩展性,但会增加类数量与复杂度。典型应用如编译器语法树遍历、报表统计等。

FallingGod的博客 105
下一篇: 前端优化的一些思考(南麓)
englishpython
博客等级 码龄5年 1粉丝 3原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值