第二十章 常见的设计模式

文章目录

  • 一、设计模式
  • 二、单例模式
  • 三、工厂模式
  • 四、抽象工厂模式
  • 五、适配器模式
  • 六、观察者模式
  • 七、代理模式
  • 八、策略模式
  • 九、MVC模式
  • 十、组合模式

一、设计模式

  1. 什么是设计模式
    • 设计模式是一种固定的解决问题的方式
    • 是一套经过代码设计经验总结优化之后的固定的方式
    • 是软件工程的基础,是代码的基石脉络
    • 是一套经过反复使用、多人知晓的、经过分类的、代码设计经验的总结
    • 为了代码的可重用性、让代码更容易被他人理解、保证代码的可靠性。设计模式使代码的编写真正的工程化;设计模式是软件工程的基石脉络,如同大厦的结构
  2. 设计模式的分类(W3C平台)
    • 构造器模式,模块化模式,暴露模块模式,单例模式,中介者模式,原型模式,命令模式,外观模式,工厂模式,Mixin模式,装饰模式,亨元(Flyweight)模式,MVC模式,MVP模式,MVVM模式,组合模式,适配器模式,外观模式,观察者模式,迭代器模式,惰性初始模式,代理模式,建造者模式,…

二、单例模式

  • 单个实例,多次操作只操作(产生)一个实例
    • 应用:
      • 一个项目中所有的信息提示框只需要有一个即可
        • 改内容,改样式
      • 贪吃蛇中的食物对象
        • 优势:节省性能,提升执行速度
    • 语法:
      1. const obj1 = {};
      2. const obj2 = new Object();
      3. const obj3 = new Fn();
        • 对构造函数进行改造
function Fn(){if(!Fn.__qfobj__){Fn.__qfobj__ = {};}Fn.__qfobj__.name = "admin";return Fn.__qfobj__;
}
  • 作业:利用构造函数的形式实现单例模式的弹出框↑↑↑

三、工厂模式

  • 流水线,多次创建多个具有相同属性名相同方法功能的不同对象
  • 工厂模式的标志:原料(创建基础对象),加工(给基础对象添加属性或方法),出厂(将基础对象返回到外部)
  • 相互独立,分别控制,互不干扰
// 构造自定义函数(内置工厂)
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// ES6新增的工厂模式(类)
class Fun(){constructor(name, age){this.name = name;this.age = age}show(){console.log(this.name, this.age)}
}
const fun1 = new Fun("张三"18)
const fun2 = new Fun("李四"20)
console.log(fun1 === fun2); 		// false

四、抽象工厂模式

  • 在工厂模式的基础上进行二次封装,将相同的属性值再次封装
// 造车厂
function CreateCart(brand, color, type){this.brand = brand;this.color = color;this.type = type;
}// 专门用来生产比亚迪的生产线
function BYDCart(color, type){return new CreateCart("比亚迪", color, type);
}const c1 = new BYDCart("白色", "SUV");
const c2 = new BYDCart("红色", "轿车");// 专门用来生产大众的生产线
function WCart(color, type){return new CreateCart("大众", color, type);
}

五、适配器模式

  • 适配器,用来将不符合功能要求的数据,包装成符合功能要求的数据
  • 需求:
    • 已知功能A,要接受类型a的数据
    • 现有类型b的数据
    • 怎么办?
      • 改造功能A,能接受类型b的数据
      • 改造类型b的数据,改造成类型a的数据
      • 创建一个适配器,让类型b的数据看起来像类型a的数据
// 电子厂:手机(打电话,玩游戏),电脑(玩游戏),一套测试模块:打电话,玩游戏
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()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)

六、观察者模式

  • 观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。
    • 发布者,被观察者
    • 订阅者,观察者
  • 发布者发布或更新信息,订阅者接收信息,并根据新的变化做出相应的处理
  • 使用观察者模式的好处:
    • 支持简单的广播通信,自动通知所有已经订阅过的对象。
    • 页面载入后目标对象很容易与观察者存在一种动态关联,增加了灵活性。
    • 目标对象与观察者之间的抽象耦合关系能够单独扩展以及重用。
  • 案例:自定义事件监听系统

七、代理模式

  • 代理模式分成两个部分,一个部分是本体:即为你想要实现的功能;另一部分为代理;代理可以代替本体实例化;
  • 代理一般使用在非常耗时的数据上,也会用在体积十分庞大的本体上
  • 劫持系统功能,拦截数据或执行动作或执行时机,完成其他功能或数据的使用
  • 应用:
    • 事件委托
    • 服务器代理解决跨域
      • 客户端a,请求服务器B的数据,跨域了,被阻止
      • 搭建一个服务器A,由服务器A,请求服务器B,获取到服务器B的数据
      • 客户端a,请求自己搭建的服务器A,服务器A将请求到的服务器B的数据给客户端a
    • setter和getter的使用

八、策略模式

  • 策略,计划,规划,可能执行的功能
  • 策略模式的核心,就是分支选择
  • 根据程序执行过程中可能会产生的变化或状态选择执行不同的功能
  • 应用:
    • 状态的变化:单个按钮,多个功能。烟花对象的区分。
    • 数据的变化:所有的函数的参数的默认值处理
  • 不使用分支语句实现策略模式
    • 配合对象
// 根据状态获取数据
// 状态为:type
// 状态值为:goods,商品数据
// 状态值为:user,用户数据
// 状态值为:cart,购物车数据// 常规写法:
// if( type === "cart" ){}// 高级写法:
const api = {goods(){return "获取商品数据"},user(){return "获取用户数据"},cart(){return "获取购物车数据"},order(){return "获取订单数据"}
}let type = "abc";// 配合异常捕获语法,捕获可能出现的报错
try{api[type]();
}catch(err){console.log(err)
}

九、MVC模式

  • MVC模式,全名:Model View Controller,模型、视图、控制器
    • M:模型:按照要求来取出数据
    • V:视图:用户直观看到的页面
    • C:控制器:向系统发出指令的工具
  • 工作流程:
    1. 浏览器,调用控制器,对他发出指令
    2. 控制器,按指令选取一个合适的模型
    3. 模型,按控制器指令取出相应的数据
    4. 控制器,按指令取出相应的视图
    5. 把第三步取到的数据按照用户想要的样子在视图显示出来
  • 优势:
    • 耦合低,复用性高
  • 如:轮播图
    • 模型:图片数据
    • 视图:轮播图如何切换(左右,上下,淡入淡出)
    • 控制器:核心功能(绑定事件,切换索引,调取数据,调取视图)
function Model(){this.m1 = function(){return "hello"}this.m2 = function(){return "world"}this.m3 = function(){return "123"}this.m4 = function(){return "hahaha"}
}
function View(){this.v1 = function(d){console.log(d);}this.v2 = function(d){alert(d)}this.v3 = function(d){document.write(d)}
}
function Control(){const m = new Model()const v = new View()this.c1 = function(){const d = m.m1();v.v2(d);}this.c2 = function(){const d = m.m4();v.v1(d);}this.c3 = function(){const d = m.m2();v.v3(d);}this.c4 = function(){const d = m.m2();v.v1(d);}
}const c = new Control();
c.c1();
c.c2();

十、组合模式

  1. 组合模式:把多个对象组成树状结构来表示局部与整体,使得用户可以同时操作单个对象或对象的组合。
  2. 对于创建动态用户界面来说,组合模式可以算是为其量身定做的,因为HTML结构正好符合组合模式适用场景的结构。
  3. 组合模式擅长对大批量对象进行操作,转为组织这类对象把操作从一个层次向下一个层次传递设计,借此可以弱化对象间的耦合关系并且可以互换使用一些类或者实例,使代码模块化程度更高,维护更容易。
  4. 简单的说,组合模式是将一批子对象组织为树形结构,一条顶层的命令会操作树中所有的下属子对象。提高了代码的模块化程度,对于动态的HTML界面具有很强的适用性。
  5. 要想使用组合模式,得先具备组合器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/616068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue2使用富文本wangeditor

安装 npm i wangeditor --save引用 import E from wangeditor;使用 // 富文本初始化initEditor() {this.isEdit true;this.$nextTick(() > {this.editor new E(this.$refs.editorElem); //绑定节点this.editor.config.height 550; //默认高度为 300,设置高度…

GLES学习笔记---立方体贴图(一张图)

一、首先看一张效果图 立方体贴图 二、纹理坐标划分 如上图是一张2D纹理,我们需要将这个2D纹理贴到立方体上,立方体有6个面,所以上面的2D图分成了6个面,共有14个纹理坐标 三、立方体 上边的立方体一共8个顶点坐标,范围…

图像处理中常用的距离

说明 在图像处理中,常用的距离度量用于衡量两个向量或特征之间的差异或相似性。以下是一些常用的距离度量及其使用说明和应用场景: 欧氏距离(Euclidean Distance):欧氏距离是最常用的距离度量,用于衡量两个…

Docker-Compose编排Nginx1.25.1+PHP7.4.33+Redis7.0.11环境

实践说明:基于RHEL7(CentOS7.9)部署docker环境(23.0.1、24.0.2),编排也可应用于RHEL7-9(如AlmaLinux9.1),但因为docker的特性,适用场景是不限于此的。 文档形成时期:2017-2023年 因系统或软件版本不同,构建…

地图多点自动缩放,居中,思路和手写

效果如下 多个标记点顺次标记连接起来zoom缩放到合适等级,刚好能放下那么多点视野刚好在正中间 zoom 实现思路 获取多点的最大经纬度点和最小经纬度点(这两个点相距离最远)计算2个这两点之间的距离地图是有比例尺的,根据比例尺…

1.傅里叶处理图片原理和代码实现

在这里首先声明,本文纯粹看了别的博主的文章,觉得博主写的原理清晰明了,容易理解,很详细,在这里写一遍是作为笔记,方便以后再翻看时容易查找。大家可以参考下面这个博文: 图像的傅里叶变换_图像…

SAP OData(二)Association

Entity之间用Association来表示关联关系,可以同CDS view中的Association一起理解。 我们在上次已经建好实体Item的基础上,再建一个Header,其方法的重写也参考Item即可,然后开始本篇的探索。 一,构建Association 1.1…

脑科学与人工神经网络ANN的发展历程与最新研究

本文深入研究了ANN的基本概念、发展背景、应用场景以及与人脑神经网络的关系。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的…

抽奖机制模型及算法

抽奖机制 连抽保底概率模型不中概率加大模型(抽卡保底) 抽奖概率为n%,在达到某次次数后,每次概率比上次高m%,直至达到保底次数(概率累加和为100%),当抽到极品道具时候,…

网络传输(TCP)

前言 我们tcpdump抓包时会看到除报文数据外,前面还有一段其他的数据,这段数据分为两部分,ip包头(一般20字节)和tcp包头(一般20字节),一般这两个头长度和为40,我们直接跳…

C语言实现单向链表

1.线性表 线性表可以分成两种 一种就是顺序表 也就是我们所熟知的数组 一种是今天的主角–链表 他们两者的区别在于 前者是顺序储存元素的 即数组元素的地址值是连续的 后者则是链式储存的 节点的地址值不一定连续 2.单向链表 链表中的节点是由两部分组成的 一部分是数据域 …

SQL-DQL-基础查询

🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页:小小恶斯法克的博客 🎈该系列文章专栏:重拾MySQL 🍹文章作者技术和水平很有限,如果文中出现错误&am…

制造业管理者必备技能:掌握6S管理!

当今竞争激烈的制造业领域,为了提高效率、优化流程,并实现持续创新,制造业管理者需要掌握一种全面、系统的管理方法——6S管理。6S管理是源自于日本的精益管理方法,通过整理、整顿、清扫、标准化、维持和安全这六个步骤&#xff0…

监督学习 - 决策树回归(Decision Tree Regression)

什么是机器学习 **决策树回归(Decision Tree Regression)**是一种机器学习算法,用于解决回归问题。与分类问题不同,回归问题的目标是预测连续型变量的值,而不是离散的类别。决策树回归通过构建一棵决策树来进行预测。…

力扣(leetcode)第599题两个列表的最小索引总和(Python)

599.两个列表的最小索引总和 题目链接:599.两个列表的最小索引总和 假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅…

基于SkyEye仿真6678处理器:实现国产操作系统ReWorks仿真运行

信号处理的数据量以及实时性的要求随着嵌入式技术的发展不断提高,众多厂商和研究所选择多核DSP处理器芯片去替代原有的单核DSP,并运行嵌入式操作系统来保证信号处理的实时性以及精确性。然而受到硬件资源或者项目实施周期限制,软件工程师调试…

AndroidQ修改永不休眠never

1&#xff1a;修改显示列表&#xff1a; /home/roadwell/Allwinner/SDK/A133/A133_PLUS_AndroidQV1.1NEW/android/packages/apps/Settings/res/values/arrays.xml --- a/res/values/arrays.xml b/res/values/arrays.xml -48,6 48,7 <item>5 minutes</item…

Jmerer之FTP测试

1、文件上传下载测试&#xff0c;可以使用sample:FTP请求&#xff0c;当然也可以使用HTTP Request采样器中的File Upload向服务器上传文件 2、本章重点介绍FTP请求进行文件的上传下载测试&#xff0c;添加 FTP请求&#xff0c;界面主要配置如下&#xff1a; Server Name or I…

Linux 软连接ln -s

什么是文件软链接&#xff1f; Linux 的“软连接”与windos 的"快捷方式"相似。文件软链接&#xff08;Symbolic Link 或 SymLink&#xff09;是一种特殊的文件类型&#xff0c;它实际上是一个指向另一个文件或目录的引用。创建软链接时&#xff0c;系统会建立一个新…

服务器配置 ssh 密钥登录

服务器配置 ssh 密钥登录 配置 服务器安全组策略&#xff0c;开放 ssh 22 端口&#xff0c;以 root 用户登录服务器。 配置 ssh key 登录 ssh-keygen 生成公钥和私钥对 如果不需要其他设置&#xff0c;一直回车 可以在 ~/.ssh 目录下看到两个文件&#xff0c;即刚生成的私钥…