面向对象设计之套路——设计模式

1、总则

面向对象的分析设计编程思想,通过封装、继承、多态把程序的耦合度降低,用设计模式使得程序更加灵活,容易修改,并且易于复用。
让业务逻辑与界面逻辑分开,让它们的耦合度下降,只有分离,才可以达到容易维护和扩展。
没有什么设计模式是完美无缺的,一个设计模式应是解决一类的问题,通常设计模式在解决一类问题的同时,还会带来别的问题,我们设计者要做的事,就是要扬长避短,充分发挥长处。

2、设计模式的分类

在这里插入图片描述

3、详细分解各个设计模式

3.1创建型

在这里插入图片描述
创建型设计模式:关注对象的创建,一共有5种
① 单例模式:单个实例,就是限制了对象的创建,重用了对象,保证一个类仅有一个实例,并提供一个访问它的全局访问点。
② 原型模式:克隆对象,换个方式创建对象,不走构造函数,而是内存拷贝。用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
简单工厂:不直接new,把对象创建转移到工厂类(不属于23种设计模式)
③ 工厂方法(类):动态生成对象,屏蔽对象的创建,留下了扩展空间。定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂模式使一个类的实例化延迟到其子类。
④ 抽象工厂:生成系列对象,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
⑤ 建造者模式:复杂对象构造,复杂的工厂方法,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

3.2 结构型

在这里插入图片描述
结构型设计模式:关注类与类之间的关系,7种
纵向关系:继承《==》实现 超强关联
横向关系:>组合>聚合>关联>依赖
依赖是出现在方法内部
另外三个是用语义区分的,可能都是一个属性
组合优于继承,结构型设计模式的核心。
①适配器模式(类和对象):转换接口,将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容不能一起工作的那些类可以一起工作。
②代理模式:快捷方式,通过代理完成对业务类的访问,包一层方便任意功能扩展。为其他对象提供一种代理以控制对这个对象的访问。
③装饰器模式:附加职责,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
④外观模式:对外统一接口,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
⑤组合模式:树形目录结构,将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
⑥桥接模式:继承树拆分,将抽象部分与它的实现部分分离,使它们都可以独立地变化。
⑦享元模式:文章共享文字对象,运用共享技术有效地支持大量细粒度的对象。
多种结构型设计模式其实都是用组合包一层,然后加功能,解决不同的问题,然后有不同的修复点,也有不同的规范。

3.3行为型

在这里插入图片描述
在这里插入图片描述
行为型设计模式:关注对象和行为的分离,11种
①职责链模式:传递职责。使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
②命令模式:日志记录,可撤销 将一个请求封闭为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
③解释器模式(类):虚拟机的机制,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
④迭代器模式:数据库数据集,提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
⑤中介者模式:不直接引用 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
⑥备忘录模式:可恢复,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
⑦观察者模式:联动,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
⑧状态模式:状态变成类,当一个对象的内存状态改变时允许改变其行为,这个对象看起来像是改变了其类。
⑨策略模式:多方案切换,定义了算法家庭,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
⑩模板方法(类):框架,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
○11访问者模式:数据与操作分离,表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

4、其它说明

4.1、甩锅大法

把锅丢出去,只管自己,哪管洪水滔天,把不稳定的地方移出去,自己只写稳定的,能保证自身的稳定。

4.2、设计模式六大原则

单一职责、里氏替换、依赖倒置、最小接口、迪米特法则、开闭原则,这些只能叫原则,是一种建议,没有实际的招数。

4.3、面向对象设计

面向对象语言开发过程中,遇到的种种场景和问题,提出了解决方案和思路,沉淀下来就变成了设计模式,解决具体问题的具体招数——套路,站在前辈的肩膀上。

4.4 面向对象设计原则

1)、单一职责原则(SRP):设计目的单一的类。就一个类而言,应该仅有一个引起它变化的原因。
2)、开放-封闭原则(OCP):对扩展开放,对修改封闭。
3)、李氏替换原则(LSP):子类可以替换父类。
4)、依赖倒置原则(DIP):要依赖于抽象,而不是具体实现;针对接口编程,不要针对实现编程。
5)、接口隔离原则(ISP):使用多个专门的接口比使用单一的总接口要好。
6)、组合重用原则(CARP):要尽量使用组合,而不是继承关系达到重用目的。
7)、迪米特(Demeter)原则(最少知识法则)(LoD):一个对象应当对其他对象有尽可能少的了解。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的想到作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用

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

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

相关文章

nginx--FastCGI

CGI 概念 nginx通过与第三方基于协议实现,即通过某种特定协议将客户端请求转发给第三方服务处理,第三方服务器会新建新的进程处理用户的请求,处理完成后返回数据给Nginx并回收进程(下次处理有需要新建),最后nginx在返回给客户端…

Jenkins流水线部署Maven项目

使用Jenkins的流水线功能,构建部署Java Maven项目,步骤很简单但是不少细节需要注意。 一、安装 Jenkins的安装步骤和流程就不具体描述,这里主要介绍一下安装时要注意的几个问题。 1、Jenkins尽量安装最新的几个版本,否则安装完成…

elixir V2测试网验证器一键部署脚本

实际收益 1、服务器环境 服务器系统:centos 7或者ubuntu 20.04(以上) CPU:2核 内存:4G 硬盘:30G ssd 网络:可靠的 100Mbit 互联网 2、部署脚本 #!/bin/bash set -eif [ "$#" -ne 3 ]; thenecho "Usage:

(已解决)org.springframework.amqp.rabbit.support.ListenerExecutionFailedException

报错截图 解决方案 1、登录rabbitMQ网址,删除所有队列 2、重启rabbitMQ 亲测有效!!!亲测有效!!!亲测有效!!!

uni-appH5Android混合开发二 || 使用Android Studio打包应用APK

前言: 在上一章节我们已经讲了如何uni-app离线打包Android平台教程,这一章就该来讲讲如何使用Android Studio打包应用APK提供给Android手机安装使用了。 uni-app跨平台框架介绍和快速入门 uni-app跨平台框架介绍和快速入门 第一步、首先打开已经编译好的…

javac编译web项目中的src

对于单个文件的且不引用其他类文件的java源码用javac编译大家都很熟悉即 javac hello.java, 服务器未安装idea,现在在服务器里面直接编译src目录 1 idea项目结构如下 2 web目录为最终部署的代码 WEB-INF下面没有 classes 目录 3 使用javac 编译src javac -encod…

图:广度优先遍历(BFS)和深度优先遍历(DFS)

1.工具类:队列和字典 export class DictionNary {// 字典的封装constructor() {this.items {}}set(key, value) {// 添加键this.items[key] value}has(key){// 判断键是否存在return this.items.hasOwnProperty(key)}get(key){// 获取键的valuereturn this.has(k…

六级仔细阅读

画两到三个词,精准定位 要原文和同义都满足才选 先看题目,在看原文,不要先看选项 做不出答案就继续往下读,读出来了就不用继续读了 分清楚是问为什么还是是什么,是什么看前面,为什么看后面 不知道就优先…

力扣HOT100 - 215. 数组中第K个最大元素

解题思路: 快速选择,目标是找出数组中第 k 小(或第 k 大)的元素,而不是对整个数组进行排序。 (需要和快排进行区分,快排的目的是排序) 注意: i l - 1, j r 1; 为什…

Spring Boot集成zookeeper快速入门Demo

1.什么是zookeeper? Zookeeper 是一个开源的分布式协调服务,目前由 Apache 进行维护。Zookeeper 可以用于实现分布式系统中常见的发布/订阅、负载均衡、命令服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。它具有以下特性…

学习Java的日子 Day45 HTML常用的标签

Day45 HTML 1.掌握常用的标签 1.1 标题标签 h1-h6 <h1>一级标签</h1> <h2>二级标签</h2> <h3>三级标签</h3> <h4>四级标签</h4> <h5>五级标签</h5> <h6>六级标签</h6> 显示特点&#xff1a; * 文字…

MemoryModule - exp - test

文章目录 MemoryModule - exp - test概述笔记测试环境GetModuleFileName不能正常执行GetModuleFileNameWntdll_LdrGetDllFullName猜测原因用LoadLibrary载入的DLL中功能是正常的 gLog可以正常使用内存载入DLL无法支持的功能的折中方法COM操作正常调用方代码接口代码 接口入参测…

基于springboot实现毕业设计系统项目【项目源码+论文说明】

基于springboot实现毕业设计系统演示 摘要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff…

绝地求生:盘点宝箱中能开出来的极品皮肤!

最近杜卡迪联名大伙儿不都开箱子出了一堆皮肤吗&#xff1f;很多人搞不清哪些皮肤要留&#xff0c;哪些皮肤可以分。 OK这篇文章稍微推荐几个我认为的高质量可兑换的皮肤&#xff0c;当然个人整理难免有疏漏&#xff0c;欢迎评论区补充。 余波学院黑丝袜 目前游戏里唯一一条显…

pgbackrest 备份工具使用 postgresql

为啥我会使用pgbackrest进行备份&#xff1f;因为postgresql没有自带的差异备份工具。。。而我们在生产环境上&#xff0c;一般都需要用到差异备份或者增量备份。我们的备份策略基本是&#xff0c;1天1次完整备份&#xff0c;1个小时1次差异备份。如果只需要完整备份&#xff0…

知识库文档系统源码部署/搭建/上线/运营/售后/更新

一款基于ThinkPHPFastAdmin开发的知识库文档系统&#xff0c;可用于企业工作流程的文档管理&#xff0c;结构化记录沉淀高价值信息&#xff0c;形成完整的知识体系&#xff0c;能够轻松提升知识的流转和传播效率&#xff0c;更好地成就组织和个人。为部门、团队或项目搭建知识库…

SVN 合并到 Git 时有文件大于 100 M 被限制 Push

如果有文件大小大于 100M&#xff0c;GitHub 是会被限制推送到仓库中的&#xff0c;大概率情况会显示下面的错误&#xff1a; remote: Resolving deltas: 100% (3601/3601), done. remote: error: Trace: aea1f450da6f2ef7bfce457c715d0fbb9b0f6d428fdca80233aff34b601ff59b re…

LeetCode 513.找树左下角的值

LeetCode 513.找树左下角的值 1、题目 题目链接&#xff1a;513. 找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null…

用字符串初始化的指针

一. 简介 前一篇文章简单学习了数组与指针的区别&#xff0c;文章如下&#xff1a; C语言中数组与指针的区别-CSDN博客 本文学习一下 初始化为 字符串的 指针。防止使用过程中出现问题。 二. 初始化指针来指向字符串 初始化指针来指向字符串&#xff0c;例如如下代码就是…

SpringBoot 具体是做什么的?

Spring Boot是一个用于构建独立的、生产级别的、基于Spring框架的应用程序的开源框架。它的目标是简化Spring应用程序的开发和部署过程&#xff0c;通过提供一种快速、便捷的方式来创建Spring应用程序&#xff0c;同时保持Spring的灵活性和强大特性。 1. 简化Spring应用程序开…