设计模式概述

一、设计模式概念

软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用

二、设计模式的分类

  • 创建型模式

用于描述 "怎么创建对象",主要把对象的创建和使用分离,包括单例、原型、工厂、抽象工厂、建造者

  • 结构性模式

用户描述如何将类或者对象组成更大的结构,代理、适配器、桥接、装饰、外观、享元、组合

  • 行为型模式

用于描述类和对象之间怎么互相完成单个对象无法完成的任务,包括模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器

三、UML

统一建模语言,用来设计软件的可视化建模语言,包括用例图、类图、对象图、活动图、时序图、状态图、协作图、构件图、部署图9中图,其中类图是显示模型的静态结构图、特别是模型中存在的类、类的内部结构以及他们与其它类的关系。设计模式中使用类图能更见可观的认识设计模式

四、类图的表示方式

1、类的表示

在uml图中,类使用包含类型、属性、方法且带有分割线的矩形表示,如下一个Person类图,包含name、age2个属性一级work方法

属性或方法前的加减号表示属性、方法的可见性

-:表示price

+:表示public

#:表示protected

属性完整表示方式:可见性 名称 :类型 [-缺省值]

方法完整表示方式:可见性 名称 (参数泪飙):返回类型

2、类之间的关系表示

关联关系可以表示类和另一个类对象之间的联系、比如老师和学生、丈夫和妻子等。分为一般关联关系、聚合关系、和组合关系

2.1、一般关系

一般关系可以分为单向关联、双向关联、自关联

单向关联

类图中用一条带箭头的实线表示,如下每个user都有一个身份证,这通过user类持有一个类型为card的成员变量类实现

双向关联

用一个不带箭头的直线表示双方各自持有对方类型的成员变量,如下user持有一个List<Teacher>,表示每个user可以有多个老师,在teacher中持有一个List<user>表示一个老师有多个学员

自关联

用一个带有箭头且指向自身的先表示,如下表示Node类包含类型为Node的成员变量

2.2、聚合关系

2.3、 组合关系

2.4、依赖关系

2.5、继承关系

2.6、实现关系

五、软件设计原则

为了是程序的扩展性好、易于维护和升级,程序猿要尽量根据6条原则来开发程序

1、开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进⾏拓展的时候,不能去修改原有的代码,实现⼀个热插拔的效果。 所以⼀句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使⽤接⼝和抽象类,后⾯的具 体设计中我们会提到这点。

2、⾥⽒代换原则(Liskov Substitution Principle) ⾥⽒代换原则(Liskov Substitution Principle LSP)⾯向对象设计的基本原则之⼀。 ⾥⽒代换原则中说,任何基类 可以出现的地⽅,⼦类⼀定可以出现。 LSP是继承复⽤的基⽯,只有当衍⽣类可以替换掉基类,软件单位的功能不受到影响时, 基类才能真正被复⽤,⽽衍⽣类也能够在基类的基础上增加新的⾏为。⾥⽒代换原则是对"开-闭"原则的补充。实现"开-闭"原则 的关键步骤就是抽象化。⽽基类与⼦类的继承关系就是抽象化的具体实现,所以⾥⽒代换原则是对实现抽象化的具体步骤的规 范。------ From Baidu 百科

3、依赖倒转原则(Dependence Inversion Principle) 这个是开闭原则的基础,

具体内容:针对接⼝编程,依赖于抽象⽽不依赖于具体。

4、接⼝隔离原则(Interface Segregation Principle) 这个原则的意思是:使⽤多个隔离的接⼝,⽐使⽤单个接⼝要好。还是⼀个降低类之间的耦合度的意思,从这⼉我们看出, 其实设计模式就是⼀个软件的设计思想,从⼤型软件架构出发,为了升级和维护⽅便。所以上⽂中多次出现:降低依赖,降低耦 合。

5、迪⽶特法则(最少知道原则)(Demeter Principle) 为什么叫最少知道原则,就是说:⼀个实体应当尽量少的与其他实体之间发⽣相互作⽤,使得系统功能模块相对独⽴。

6、合成复⽤原则(Composite Reuse Principle) 原则是尽量使⽤合成/聚合的⽅式,⽽不是使⽤继承

相关推荐
斌斌_____14 分钟前
Spring Boot 配置文件的加载顺序
java·spring boot·后端
火云洞红孩儿15 分钟前
基于AI IDE 打造快速化的游戏LUA脚本的生成系统
c++·人工智能·inscode·游戏引擎·lua·游戏开发·脚本系统
路在脚下@23 分钟前
Spring如何处理循环依赖
java·后端·spring
一个不秃头的 程序员1 小时前
代码加入SFTP JAVA ---(小白篇3)
java·python·github
丁总学Java1 小时前
--spring.profiles.active=prod
java·spring
上等猿1 小时前
集合stream
java
java1234_小锋1 小时前
MyBatis如何处理延迟加载?
java·开发语言
菠萝咕噜肉i1 小时前
MyBatis是什么?为什么有全自动ORM框架还是MyBatis比较受欢迎?
java·mybatis·框架·半自动
林的快手1 小时前
209.长度最小的子数组
java·数据结构·数据库·python·算法·leetcode
FeboReigns1 小时前
C++简明教程(4)(Hello World)
c语言·c++