设计模式 01、uml与设计原则

设计模式系列(01):总览与引导 本文为设计模式系列的开篇,旨在为读者提供设计模式的整体认知框架。文章首先介绍了设计模式的基本概念,强调其作为软件设计中反复出现问题的解决方案,能够提升系统的可维护性和可扩展性。接着,文章探讨了UML(统一建模语言)在设计模式中的应用,详细说明了UML图类型及其在表达设计模式结构中的作用。此外,文章还解释了面向对象设计中的关键术语,如聚合、组合、依赖等,并介绍了PlantUML工具的使用及其在UML建模中的优势。最后,文章概述了面向对象设计的六大原则(SOLID),并简要提及了设计模式的分类及其典型应用场景, 阅读详情

1. UML

1.1 类图

1.1.1 属性

01
以上对应的代码:

public class Employee {
	public String name;    
	protected int age = 25;
	private String email;
}

1.1.2 方法

02

1.2 类之间的关系

1.2.1 关联(association)

用于表示一类对象与另一类对象之间有联系,通常将一个类的对象作为另一个类的成员变量。
03

1.2.1.1 单向关联

04

1.2.1.2 双向关联

05

1.2.1.3 自关联

06

1.2.1.4 多重性关联

表示两个关联对象在数量上的对应关系
07

比如,一个界面可以包含0个或多个按钮,但一个按钮只能属于一个界面
08

1.2.1.5 聚合(Aggregation)
  • 聚合关系表示类之间整体与部分的关系
  • 在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在
  • 在UML中,聚合关系用带空心菱形的直线表示
    09

注入方式:setter注入、构造器注入

1.2.1.6 组合(Composition)
  • 组合关系表示类之间整体与部分的关系
  • 在组合关系中,成员对象与整体对象之间具有同生共死的关系,一旦整体对象不存在,成员对象也将不存在
  • 在UML中,组合关系用带实心菱形的直线表示

10
通常,在整体类的构造函数中就会初始化部分类的实例。

1.2.2 依赖(Dependency)

依赖关系的三种表现:

  • 在一个类的方法中将另一个类的对象作为其方法参数
  • 在一个类的方法中将另一个类的对象作为其局部变量
  • 在一个类的方法中调用另一个类的静态方法

1.2.3 继承(Generalization)

11

1.2.4 实现(Realization)

12

1.3 注释

13

2. 面向对象的设计原则

1)单一职责原则(Single Responsibility Principle, SRP)

定义:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。

就一个类而言,应该仅有一个引起它变化的原因。

分析:

  • 一个类承担的职责越多,当某个职责变化时,可能会影响其他职责的运作,这就会降低该类的可复用性
  • 将职责进行分离,不同的职责封装在不同的类中
  • 将不同的变化原因封装在不同的类中
  • 单一职责原则是实现高内聚、低耦合的指导方针

2)开闭原则(Open-Closed Principle, OCP)

定义:对扩展开放(对提供方), 对修改关闭(对使用方)。

分析:

  • 抽象化是开闭原则的关键
  • 相对稳定的抽象层 + 灵活的具体层。用抽象构建框架,用实现扩展细节。
  • 找到系统的可变因素并将其封装起来

开闭原则是最重要的原则,它是面向对象设计的目标。

3)里氏替换原则(Liskov Substitution Principle, LSP)

定义:所有引用父类的地方必须能透明地使用其子类的对象

分析:

  • 在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常
  • 在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法
  • 在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型
  • 里氏替换原则指明了继承实际上增强了类之间的耦合,在适当的情况下,应考虑聚合、组合、依赖而不是继承

里氏替换是实现OCP的重要方式之一。

4)依赖倒置原则(Dependence Inversion Principle, DIP)

定义:高层模块不应该依赖低层模块,二者都应该依赖抽象。抽象不应该依赖细节,细节应该依赖抽象。

面向接口编程,而不是针对实现编程

分析:

  • 传递参数时或在关联关系中,尽量引用层次高的抽象层类。即,使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等
  • 在程序中尽量使用抽象层进行编程,而将具体类写在配置文件中
  • 针对抽象层编程,将具体类的对象通过依赖注入(Dependency Injection, DI)的方式注入到其他对象

DI 的三种方式

  • 接口注入
  • 构造方法注入
  • setter方式注入

OCP是面向对象设计的目标,而DIP则是面向对象设计的实现。

大多数情况下,OCP、LSP 和 DIP 会同时出现。OCP是目标,LSP是基础,DIP是手段

5)接口隔离原则(Interface Segregation Principle, ISP)

定义:一个类对另一个类的依赖应该建立在最小的接口上。即客户端不应该依赖那些它不需要的接口。

分析:将大接口中的方法根据其职责的不同分别放在不同的小接口中,以确保每个接口使用起来都较为方便,并职责单一

6)迪米特法则(Law of Demeter, LoD)

定义:一个类对自己依赖的类知道的越少越好。类与类关系越密切,耦合度越大。

LoD可以降低类之间的耦合(注意是降低,而不是要求完全没有依赖关系

分析:

  • 迪米特法则要求在设计系统时,应该尽量减少对象之间的交互
  • 如果两个对象之间不必彼此直接通信,那么这两个对象就不应该发生任何直接的相互作用
  • 如果其中一个对象需要调用另一个对象的方法,可以通过“第三者”转发这个调用
  • 通过引入一个合理的“第三者”(中间类)来降低现有对象之间的耦合度

一个对象只与直接朋友发生交互,“不和陌生人说话”

  • 直接朋友
    • 当前对象本身(this)
    • 以形参形式传入到当前对象方法中的对象
    • 当前对象的成员对象
    • 如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友
    • 当前对象所创建的对象

7)合成复用原则(Composition/Aggregate Reuse Principle, CARP)

定义:优先使用对象组合/聚合,而不是继承,从而达到复用的目的。

继承破坏了封装性,将父类的内部细节暴露给了子类,是一种“白箱复用”
组合/聚合是一种"黑箱复用",局部对象的内部实现细节对整体对象是不可见的

分析:

  • 合成复用原则就是在一个新的对象里通过关联关系来使用一些已有的对象,使之成为新对象的一部分
  • 新对象通过委派调用已有对象的方法达到复用功能的目的
  • 复用时要尽量使用组合/聚合关系(关联关系),少用继承

设计的核心思想

  • 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起(封装变化点)
  • 针对接口编程,而不是针对实现编程(面向接口编程)
  • 为了交互对象之间的松耦合设计而努力 (多使用组合/聚合,而不是继承)

总结

3. 设计模式

3.1 设计模式的四大要素

  • 模式名称
    • 大多数模式是根据其功能或模式结构来命名的
  • 问题描述
    • 应该在何时使用模式,它包含了设计中存在的问题以及问题存在的原因
  • 解决方案(类图)
    • 每一个设计模式的类图,类图中每一个角色的意义以及它们之间的关系
    • 实现该模式的一些核心代码
  • 效果
    • 模式的优缺点,满足了哪些设计原则

每个模式至少应该掌握如下几点:

  1. 这个模式的意图是什么
  2. 它要解决一个什么问题
  3. 什么时候可以使用它
  4. 它是如何解决问题的
  5. 掌握它的结构图
  6. 记住它的关键代码
  7. 能够想到至少两个它的应用实例。一个生活中的,一个软件中的
  8. 这个模式的优缺点是什么
  9. 使用时要注意什么

3.2 23种设计模式的分类

  • 创建型(Creational):主要描述如何创建对象
    • 工厂方法模式(Factory Method)
    • 抽象工厂模式(Abstract Factory)
    • 单例模式(Singleton)
    • 建造者模式(Builder)
    • 原型模式(Prototype)
  • 结构型(Structural):主要描述如何实现类或对象的组合
    • 适配器模式(Adapter)
    • 桥接模式(Bridge)
    • 组合模式(Composite)
    • 装饰模式(Decorator)
    • 外观模式(Facade)
    • 享元模式(Flyweight)
    • 代理模式(Proxy)
  • 行为型(Behavioral):主要描述类或对象怎样交互和怎样分配职责
    • 职责链模式(Chain of Responsibility)
    • 命令模式(Command)
    • 解释器模式(Interpreter)
    • 迭代器模式(Iterator)
    • 中介者模式(Mediator)
    • 备忘录模式(Memento)
    • 观察者模式(Observer)
    • 状态模式(State)
    • 策略模式(Strategy)
    • 模板方法模式(Template Method)
    • 访问者模式(Visitor)
论文精读-ReTransformer ReRAM-based Processing-in-MemoryArchitecture for Transformer Acceleration Transformer已经成为一种流行的深度神经网络(DNN)模型,用于神经语言处理(NLP)应用,并在神经机器翻译、实体识别等方面表现出优异的性能。然而,其在自回归解码器中的规模化点积注意机制在推理过程中带来了性能瓶颈。Transformer也是计算和内存密集型的,需要硬件加速解决方案。 阅读详情

相关推荐

逻辑漏洞:水平越权、垂直越权靶场练习

水平越权和垂直越权是组织中常见的管理问题,指的是员工在组织中所拥有的权力和责任超出其职位所应具备的范围。 水平越权是指员工在同一级别的职位上超越了其同事的权力和责任范围,通常表现为某个员工在团队中承担了过多的任务或权力,导致其他同事感到不公平或不满。 垂直越权则是指员工在组织中超越了其职位等级的权力和责任范围,通常表现为员工在没有得到上级批准的情况下做出决策或行动,可能会导致组织内部的混乱和冲突。

qq_68163788的博客 2469

UML类图

类图 是用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据。 1.类的UML图示 在UML中,类使用包含类名,属性和方法且带有分隔线的长方形来表示; 例如定义一个Person类,包含属性name,age,拥有eating方法,则UML类图如下图示: 对应的java代码为: public class Pe...

Ryze 1927

IBIS模型中的Pullup和Pulldown曲线详解:如何避免信号完整性设计中的常见错误

本文深入解析IBIS模型中Pullup和Pulldown曲线的关键作用,揭示其在信号完整性设计中的黄金法则。通过详细分析曲线特性、常见误区及验证方法,帮助工程师避免设计错误,优化高速PCB设计。文章还展示了曲线数据在动态终端匹配、串扰预测和电源完整性分析中的高级应用,提升设计效率和可靠性。

weixin_30275415的博客 447

入门计算机的粗略学习-Day6

UML图 概念介绍 UML图是产品必修课之一,可以帮助程序员梳理业务模型和业务流程,帮助程序员快速理解业务关系。一般至少需要掌握一种结构型UML图和一种行为型UML图。 在软件领域,影响力最强的建模工具当属统一建模语言(UnifiedModeling Language,UML)了。1997年,对象管理组织(Object Management Group,OMG)发布了UML。UML的目标之一是为开发团队提供标准通用的设计语言来开 发和构建计算机应用。UML提出了一套IT专业人员期待多年的统一的标准建模符号。

imudges_Zy的专栏 771

利用GPAC生成MP4文件

GPAC主要针对学生和内容创作者,代表了一个跨平台的多媒体框架,开发人员可以使用它在 LGPL 许可下制作开源媒体。GPAC多媒体框架兼容范围广泛的流行文件类型,从常见格式(如 AVI、MPEG 和 MOV)到复杂格式(如 MPEG-4 系统或 VRML/X3D)和 360 电影。

深之JohnChen的专栏 1770

ESP32+HC-SR04超声波测距:5分钟搞定智能避障小车核心功能(附完整代码)

本文详细介绍了如何使用ESP32开发板和HC-SR04超声波测距模块快速构建智能避障小车的核心功能。通过优化的接线方案、核心代码实现及调试技巧,帮助开发者5分钟内完成硬件连接与软件编程,实现高效的避障功能。附完整代码,适合创客教育和机器人开发。

weixin_29185199的博客 384

关于讲解UML及设计模式很好的文章

https://design-patterns.readthedocs.io/zh_CN/latest/read_uml.html

善守者 164

PowerBI参数化实战:3分钟搞定动态数据源切换(附常见错误排查)

本文详细介绍了PowerBI参数化实战技巧,教你3分钟实现动态数据源切换。通过创建参数、改造查询和测试切换三步,轻松应对多环境部署与团队协作中的路径问题,并附上常见错误排查指南,有效提升报表的可维护性和工作效率。

p1q2r的博客 585

UML基本概念及七大设计原则

统一建模语言UML:IBM的建模语言UML

u011497426的专栏 4362

深度学习注意力机制新突破:YOLOv8结合SimAM无参数注意力模块,让目标检测更精准!

在计算机视觉领域,注意力机制已成为提升模型性能的关键技术。然而,传统的注意力模块如SENet、CBAM等往往引入大量额外参数,增加了模型的复杂度和计算负担。本文介绍一种创新的无参数注意力机制——SimAM(Simple Parameter-Free Attention Module),并将其成功应用于YOLOv8目标检测框架。SimAM基于神经科学理论,通过定义能量函数为特征图计算3D注意力权重,无需任何额外参数即可显著提升模型性能。本文详细阐述了SimAM的理论基础、实现原理,并提供了完整的YOLOv8集

YOLO 97

PrimeTime low power-SMVA分析(4)

这些功能只有在将timing_enable_cross_voltage_domain_analysis变量设置为true时才能使用。DVFS场景与在分布式多场景分析(DMSA)中分析的运行条件场景无关。- check_timing 和 report_exceptions 命令通过将检查或报告应用于所有可能的场景和电压组合来支持SMVA。- 相位锁定环生成的时钟(create_generated_clock -pll_feedback 和 -pll_output)在多个场景的情况下,返回最差情况的值。

QRBQ 649

XML解析技术

XML,跟java无关,自己本身是一种可扩展的标记语言。成对出现,主要用来表达数据结构复杂之处。 用途上1:用在跨平台数据传递:2.充做配置文件。 规范上:分二个级别: 1,合法的XML:1.遵循标记书写正确,必须成对出现,有开始就有结束,除非是单标记 2,整个标记只能有一个根元素,3,标记嵌套必须正确,不能出现交叉标记。 2,有效的XML:指符合DTD(文档类型定义)

xiangziyong1989的博客 509

[STC32G144K246入门第六步]DAC驱动

本文摘要介绍了STC32G144微控制器内置的12位DAC模块特性与应用。该芯片集成双通道独立DAC,需通过内部运放缓冲后从P0.7/P5.0引脚输出,支持音频处理、波形生成等应用场景。重点阐述了DAC的R-2R梯形网络工作原理、关键性能指标(12位分辨率、转换速度等)及编程配置方法,包括频率设置、寄存器操作和运放引脚配置。文中还提供了32点正弦波表示例和初始化代码,强调参考电压稳定性对输出精度的重要影响。

sinat_58149788的博客 139

【设计模式学习01】设计模式概述,UML图,软件设计原则

设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中。1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫·亚历山大(ChristopherAlexander)在他的著作《建筑模式语言城镇、建筑、构造》中描述了一些常见的建筑设计问题,并提出了253种关于对城镇、邻里、住宅、花园和房间等进行设计的基本模式。1990年软件工程界开始研讨设计模式的话题,后来召开了多次关于设计模式的研讨会。GoF)著称。...

一个正在努力学习的iter 631

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

软件设计师:11-结构化开发与UML

基础知识题目解说

Laptoy的博客 2万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

设计模式01

类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。

Sky_小天 1421

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

设计模式-day01

类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。

weixin_45465628的博客 1167

DesignPattern设计模式

简述 :提供一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 面向接口(抽象)编程?闻到内味了吗?7大设计原则中的依赖倒置原则、迪米特法则、接口隔离原则。 当然不止用到了一个原则,一般设计模式都是多个设计原则的集合体。 简单工厂模式# 简述:创建产品接口,需要产品时,利用工厂进行创建即可。 反例 : Copy public class negtive { /*=服务端========*/ interface Food{ voi

xuqidashazi7的博客 456

设计模式01 UML图,软件设计原则,创建型模式

“设计模式”最初并不是出现在软件设计中,而是被用于建筑领域的设计中。1995年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides四位作者(GoF)合作出版了《设计模式:可复用面向对象软件的基础》一书,在此书中收录了23个设计模式,这是设计模式领域里程碑的事件,导致了软件设计模式的突破。是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特

qq_53157982的博客 579

设计模式 & python

提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。

bgape002的博客 1471

设计模式笔记01(java版)

设计模式概述和软件设计原则

weixin_46425661的博客 923

图解Java设计模式之设计模式面试题

图解Java设计模式之设计模式面试题1.1 Java设计模式内容介绍1.1.1 先看几个经典的面试题1.1.2 设计模式的重要性 1.1 Java设计模式内容介绍 1.1.1 先看几个经典的面试题 原型设计模式问题 : 1)有请使用UML类图画出原型模式核心角色 2)原型设计模式的深拷贝和浅拷贝是什么。并写出深拷贝的两种方式的源码(重写clone方法实现深拷贝、使用序列化来实现深拷贝) 3)在S...

不一样的花朵的博客 930

【设计模式整合】20秒速记23种设计模式。设计模式7原则,UML类图。创建,结构,行为型。

设计模式7原则,UML类图。创建,结构,行为型。速记23种设计模式。

qq120631157的博客 810

UML期末考试总结

uml相关 01,uml图,每种图包含什么元素。 08,Uml图有多少种图,分为哪几类 UML定义了5类,9种模型图 用例图 静态图、包图、对象图 行为图:状态图、活动图 交互图:顺序图、协作图 实现图:构件图、部署图 13,uml图每种图的概念,怎么表示,符号,怎么画。比如说状态图通常是什么样的情况下会发生状态转换,怎样去定义他 19,用uml建立系统分析和设计,需要建立的视图...

star_of_science的博客 6943

设计模式-01

黑马设计模式

qq_40298175的博客 741

设计原则与思想:面向对象

设计模式学习导读 (3讲) 01 | 为什么说每个程序员都要尽早地学习并掌握设计模式相关知识? 应对面试中的设计模式相关问题 告别写被人吐槽的烂代码 提高复杂代码的设计和开发能力 如何分层、分模块?应该怎么划分类?每个类应该具有哪些属性、方法?怎么设计类之间的交互?该用继承还是组合?该使用接口还是抽象类?怎样做到解耦、高内聚低耦合?该用单例模式还是静态方法?用工厂模式创建对象还是直接 new 出来?如何避免引入设计模式提高扩展性的同时带来的降低可读性问题?……各种问题,一下子挤到了我面前。 让读源

weixin_43719015的博客 303
上一篇: 开发工具:静态代码扫描工具sonarqube
下一篇: 开发工具: IDEA使用技巧
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值