首页 > 其他分享 >LL学设计模式之最终章

LL学设计模式之最终章

时间:2024-09-22 12:02:21浏览次数:10  
标签:原则 对象 创建 LL 模式 工厂 设计模式 最终

学习过好多遍设计模式。感觉还是没学会。面试啥的又说不出来。

这是最后一次了。忘了并不代表不会。 知道个大概就行了

为啥要学设计模式:
1:阅读源代码的时候,知道是啥设计模式,就更容易看懂。
2:为了写出好的容易扩展的代码。应对 各种 变化。简单。

设计模式有指导原则。设计模式一般都是遵循设计原则的。
面向对象的原则:SOLID

  • S:SRP
    单一职责原则:一个类最好只做一件事。这样修改此类的时候影响小。也容易了解类。小类小方法。人的大脑更容易处理。
  • O: OCP
    开闭原则:only append,not update. 对扩展开放。对修改关闭。在一个项目上写代码。我们肯定希望的是只是增加代码,而不是在原来的代码上修改(不是自己写的。要修改就很痛苦,也容易出错)。好的设计模式就应该这样。但是呢,工作中在原来的代码上修改也是不可避免的。原则毕竟是理想主义。现实主义还是得修修补补的。
  • L:
    里氏替换原则:子类尽量不要修改父类的方法。这样子类替换父类的时候。一般就不会出错了。
  • I:IRP
    接口隔离原则:接口也是要保持高内聚 低耦合。不要把过多的接口方法放在一个接口里。这样实现接口的时候就很可能出现冗余。
  • D:DIP
    依赖反转原则:这个以前学习spring框架的时候就没理解。说的很抽象。其实就是我们运行代码的时候,实际依赖的是具体的子类,但是写代码的时候我们要依赖的是子类的抽象,也就是父类。所以就是反转了。从子类反转到父类了。这样的好处就是解耦和统一抽象。容易替换不同的子类。抽象也就是定义接口,定义规范。我们依赖的是规范就不容易乱。
    依赖翻转还有相关的就是控制翻转(Inversion Of Control)。这里的反转。反转的是我们创建对象。比如。没有spring这种IOC框架的时候。对象的创建是我们自己写代码创建出来的。现在创建对象交给框架了。反转点在这。我们不关注创建。只关注具体的业务实现。

DIP和IOC都是设计原则。根据这俩个设计原则有了 DI(依赖注入是设计模式)。IOC容器框架就是DI的具体实现。
DI就是对象之间的关系我们只需要注解就直接拥有了。框架根据 构造方法、属性、方法注入某个对象到当前对象。

分层原则:一个层只关注一件事,然后只和它的上下层交互。各司其职。
简单原则:简单的实现复杂的功能。我们的大脑太次了。代码大部分是来阅读的。
分离原则:复杂的问题简化简化再简化。
契约原则:约定大于俗称。计算机发展到现在了,该有一定的模式,让我们程序员有共同的默契。知道哪些配置 哪些流程就该是这样的。

设计模式之 创建型

设计模式主要分为三大类:
创建型:主要解决如何创建对象。
结构性:对线之间的关系应该如何处理。是你继承我,还是我组合你。是依赖你的抽象等等。
行为型:主要是关于方法的处理。各种方法应该如何封装实现。

单例模式

在整个进程 程序中。这个类只有一个对象。像个全局变量一样。从哪获取到都是唯一的。
首先要提供全局获取到该对象的方法。
经典实现的右 懒汉模式、饿汉模式、双重校验(多线程的情况下)、枚举、线程ThreadLocal(这里是每个线程有自己独立的实例,不是全局一个)

简单工厂、抽象工厂、工厂方法

就是把创建对象这个变化封装起来。由工厂负责。 客户端只需要调用工厂这个类就行。修改点就在这个工厂类。
简单工厂:只有一个工厂。一个静态方法创建几个很少的对象。有更新的时候要修改这个工厂类的方法。违反了开闭原则。
工厂方法:有很多个工厂。每个具体的工厂创建不同同类型的不同产品。新增产品就新增工厂就行。主要是定义了抽象工厂的创建产品的类方法。 类会及很多。 日志类框架就是
抽象工厂:也是有很多个工厂。一个工厂创建的不是一个产品。而是相关的一系列产品。

原型模式

根据现有的对象创建新的对象。对象比较复杂。java就用 浅克隆 +深克隆实现。

建造者模式

创建不同形式的复杂对象。 其实就是链式编程。每个buildPart方法都返回自己的实例对象。

设计模式 之 结构型

适配器模式

解决的问题场景:原有的类不能修改。但是与新的类的接口不适配。我们就写一个适配类,专门写一个新接口调用原有的类。

桥接模式

桥:连接的俩端。可以独立的变化。比如 形状+颜色。都可以独立的实现。然后组合起来。

组合模式

可以让单个对象和组合对象的处理方式保持一致。常用在树形结构。

装饰模式、代理模式

这2个模式一起说。是因为这2个看起来很像。就是专注度不一样
装饰模式:动态的增强原有类的功能。是纵向的。可以使用继承,组合。修改对象的行为
代理模式:需要控制对象的访问。权限、模拟。虚拟代理、远程代理、缓存代理。控制对象的访问。

门面模式:

就是把一些复杂的方法再用一个类封装下。门面上好调用。对子系统提供统一的接口。

享元模式

一个对象有内在状态+外在状态。要创建很多对象可以共享其不变的内在状态。来减少内存的使用。

设计模式 之 行为型

类行为:继承
对象行为:组合或聚合

访问者模式

允许在运行时将一个或多个操作应用于一组对象。将操作于对象结构分离。
扫描文件。解压文件。
文件都可能需要扫描。扩展对象。
使用多态的方式。资源文件就比较臃肿。
每种操作都独立写成一个类。新增操作就新增类。
参考这个讲的很好 https://blog.csdn.net/SunnyYoona/article/details/140938479

模板方法

定义一个算法框架。其中部分算法步骤延迟到子类实现。

策略模式

每个算法封装起来,可以互相替换。

状态模式

根据不同的状态可以执行不同的行为。 状态更新图要了解。 到了一定的状态只能执行一定的操作。比如订单。
一个状态一个类。

观察者模式

订阅-发布模式。就是一个对象的变化需要通知给订阅该对象的多个对象。并执行相应的操作。

备忘录模式

可以回退到 历史记录的某一个状态。undo操作。会创建一个备忘录对象。然后根据备忘录对象恢复。

中介者模式

对象之间网状结构更改为星型结构。

迭代器模式

经典的遍历。每个对象的遍历行为。专门来创建一个迭代器对象。迭代器对象的hasNext() next()方法来遍历。统一美。

解释器模式

了解。自定义配置规则。

命令模式

请求中封装多个参数。请求封装为对象。一个请求就是一个对象。
请求和执行进行了解耦。

责任链模式

就是一个请求需要多个过滤审批操作。我们只关注和我们对接的。比如请假我只需要提交电子流给我们的PM.然后我们的PM再一个一个请求到上面的领导。直到能给我批准结束。
如果是一天假。PM就可以操作审批通过。如果是3天假。就得HRBP了。
当前责任对象会设置下一位。

总结

设计模式。有好有害。一般是有更多的抽象 + 封装 来应对 变化。让新增扩展 不更改更多的类。
设计的时候。要知道哪些是变化点。应不应该封装成一个新的类。
让系统变得更加复杂。好扩展。解耦。

标签:原则,对象,创建,LL,模式,工厂,设计模式,最终
From: https://www.cnblogs.com/clllll/p/18425146

相关文章

  • ORA-01558: out of transaction ID’s in rollback segment SYSTEM
    联系:手机/微信(+8617813235971)QQ(107644445)标题:ORA-01092ORA-00604ORA-01558故障处理作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]客户一个11.2.0.1的库,在重启之前报ORA-00604和ORA-01558:outoftransactionID’sinrol......
  • Shell脚本编程基础(四)
    五种常用文本工具和Crontab调度工具(一)cut:用于从文本中提取特定的字段或列。grep:用于搜索文本中的特定模式。awk:用于处理和分析文本。sed:用于文本替换和编辑。sort:用于对文本行进行排序。CrontabCrontab是用于定时任务调度的工具,可以用来定期执行脚本或命令。......
  • Shell脚本编程基础(一)
    LinuxShell编程入门在Linux系统中,Shell是一个重要的工具,它充当应用程序与计算机内核的交互桥梁。本文将介绍Shell编程的一些基本知识,并通过实例帮助你更好地理解和使用它。什么是Shell?Shell是一种解释型的编程语言,通过解释器将代码翻译成计算机可理解的语言。在......
  • 【人工智能时代】- 同济大学发布最新检索增强(RAG)的LLM生成技术综述
    摘要1引言1.1大型语言模型的进步1.2面临的挑战1.3解决方案:检索增强生成(RAG)1.4RAG的研究和发展1.5研究背景2背景2.1RAG的定义2.2RAGvs微调2.3RAG的优势3RAG框架3.1原始RAG(NaiveRAG)3.2高级RAG(AdvancedRAG)3.2.1预检......
  • 如何使用nodejs显示“Hello World”的教程
    安装Node.js打开浏览器:打开GoogleChrome或MicrosoftEdge。下载Node.js:访问Node.js网站。选择适合您的操作系统的最新版本,例如Windows64位。单击最新版本(例如版本2.46.0)下载安装程序。安装Node.js:下载完成后,打开安装程序文件。按照屏幕上显示的安装步骤进行操作。完......
  • CTF-PWN-ret2shellcode全解
    ##入门级shellcode在平时遇到题目时候我们第一步查看保护,然后再根据反汇编的程序进行判断程序能够用哪种攻击方法入门级的shellcode肯定就是简单的看,但是那种无限制且可以直接执行的就不给大家讲了,那种是非常非常简单的了,首先给大家看一个例题:源码:保护:有新手会问,开启了nx......
  • A SURVEY ON FAIRNESS OF LARGE LANGUAGE MODELS IN E-COMMERCE: PROGRESS, APPLICATI
    本文是LLM系列文章,针对《ASURVEYONFAIRNESSOFLARGELANGUAGEMODELSINE-COMMERCE:PROGRESS,APPLICATION,ANDCHALLENGE》的翻译。电子商务中大型语言模型公平性的调查:进展、应用与挑战摘要1引言2电子商务LLM的原则3偏差挑战4电子商务应用5未来方......
  • kimi智能助手1.4.5,2024-09-21,什么是大语言模型(LLM)?
    大语言模型(LargeLanguageModels,简称LLM)是指通过深度学习技术训练出的、具有大量参数的语言处理模型。这些模型通常使用大量的文本数据进行训练,以学习语言的模式和结构,从而能够理解和生成自然语言。大语言模型的特点包括:参数众多:大语言模型通常拥有数十亿甚至数千亿个参数,这......
  • 【JavaWeb从入门到精通系列】 - JavaSE基础篇(1) - 抽象,静态,单例设计模式
    一、抽象1、存在意义似是而非的,像却又不是;具有某种特征,但不完整。Animal仅是一种会吃会睡的对象,再无其他行为,不够具体,不够完整。程序是用来模拟现实世界,解决实际问题的,现实世界中存在的都是动物具体的子类对象,并不存在动物对象,所以,Animal不应该被独立创建成对象。如何......
  • JAVA集合——Collection接口
    目录1.Collection接口1.概述2.常见方法a.对象添加到集合中b.清空集合中所有的元素c.把给定的对象在当前集合中删除d.判断是否包含 e.判断集合是否为空f.返回集合元素中集合个数​编辑3.Collection的遍历方式a.迭代器遍历1.获取迭代器2.迭代器中常见的方法a.......