龙岩做网站开发哪家做的好,厦门公司注册程序注册程序,响应式公司官网建设,冀州网站建设代理说明#xff1a;设计模式#xff08;Design Pattern#xff09;对于软件开发#xff0c;简单来说#xff0c;就是软件开发的套路#xff0c;固定模板。在学习设计模式之前#xff0c;需要首先学习UML#xff08;Unified Modeling Language#xff0c;统一建模语言设计模式Design Pattern对于软件开发简单来说就是软件开发的套路固定模板。在学习设计模式之前需要首先学习UMLUnified Modeling Language统一建模语言和面向对象设计的七大原则。
UML
设计模式在代码开发之前先需要使用设计图的方式表现出来UML是生产设计图的语言也就是模型语言。UML的结构有视图View、图Diagram、模型元素Model Element、通用机制General Mechanism这里不做过深的介绍只介绍类图和类之间的关系。
类图Class Diagram
结构
一般来说一个类由三个部分组成类名、属性和方法。如下这个类图
类名Teacher属性nameString、ageint默认值是0、genderString方法setAge(int age)、getName()
其中属性和方法前面的符号分别表示可见性公有public、私有private、受保护protected分别用“”、“-”、“#”来表示在Java中还有一种包内可见性package使用“*”来表示。
对于属性在属性类型后面加 “ xx”表示此属性设置默认值为“xx”表示方式如下
可见性 名称类型 [ 默认值]对于方法表示方式如下
可见性 名称[参数列表][返回类型]以上方括号中的部分表示可有可无 如果该类是一个接口类图表示如下 其他内容不变类名上面加两个尖括号包裹的interface也有在类名左上角使用一个类似圆形取卡针标志来表示的如下 类之间关系
类与类之间的关系分为以下几种
关联关系
关联指类与类之间存在联系可分为双向关联、单向关联、自关联、多重性关联、聚合和组合如下 如下表示一个按钮Button只能属于一个表单Form是一对一的关系而一个表单可以有0个或多个按钮
常见的多重性关系有1…1一对一、0…* 0对多 、1…*1对多、0…10对一、m…n多对多 例如汽车Car与发动机Engine发动机是汽车的组成部分可以独立于汽车存在并不依赖于汽车 例如头Head与眼睛Eye眼睛是头的组成部分但是眼睛不能单独出来头没有了眼睛也就没有了
依赖关系
例如驾驶员Driver与车Car的关系驾驶员依赖于车没有车就无法使用驾驶方法
泛化关系
泛化关系就是继承关系如下学生类Student和教师类Teacher继承于人类Person
实现关系
实现关系顾名思义如下船Ship与车Car实现于交通工具接口Vehicle并实现其移动方法move 其他
实际上UML的图远不止这些还有用例图Use Case Diagram、对象图Object Diagram、包图Package Diagram等加上类图共13个但是类图用的最多。
在我手边的《设计模式》第二版清华大学出版社第5页刘伟主编中作者引用了Martin Fowler著作中的一段话“If someone were to come up to you in a dark alley and say, ‘Psst, wanna see a UML diagram?’ that diagram would probably be a class diagram.The majority of UML diagrams Isee are class diagrams.”“如果有人在黑暗的小巷中向你走来并对你说嘿想不想看一张UML图那么这张图很有可能就是一张类图我所见过的大部分的UML图都是类图” 面向对象设计原则
面相对象设计原则指在程序设计时遵循的规范有以下七个
单一职责原则Single Responsibility PrincipleSRP
单一职责原则定义一个对象应该只包含单一的职责并且该职责被完整地封装在一个类中。
简单来说就是一个类应该只干一件事。例如在没有三层架构前一个请求从接收、分析、处理都在一个类里完成无论这个请求的哪一个环节发生了改变都需要修改代码可维护性差代码耦合高。 开闭原则Open-Closed PrincipleOCP
开闭原则定义一个软件实体应当对扩展开发对修改关闭。
就是说后面如果需要新增需求可以在不修改源码的基础上对系统扩展。举个例子一个管理系统的界面有许多的记录许多筛选项最开始记录的字段少筛选项也少后面字段越来越多需要新增一些筛选条件。
不符合开闭原则的做法对DTO对象不断地新增筛选项name姓名、age年龄、createTime创建时间……
符合开闭原则的做法在DTO对象里定义一个Map对象conditions用于接收前端传递的条件参数。这样无论后面新增多少个筛选条件实体类都不需要修改只需要在Mapper.xml里面新增筛选字段conditions.字段名的查询条件即可
private MapString, String conditions;里氏代换原则Liskov Substitution PrincipleLSP
里氏代换原则可以通俗表述为在软件中如果能够使用基类父类对象的地方那么一定能够使用其子类对象。 依赖倒转原则Dependency Inversion PrincipleDIP
依赖倒转原则定义高层模块不应该依赖底层模块他们都应该依赖抽象。抽象不应该依赖细节细节应该依赖于抽象。 接口隔离原则Interface Segregation PrincipleISP
接口隔离原则定义客户端不应该依赖那些它不需要的接口。
就是说对于接口应该尽可能细化而不是把一堆接口放到到一个大接口里面。如接口A表示飞行接口B表示跳跃接口C表示鸣叫虽然这三个特性麻雀完全符合但是不能把这三个接口合并到一个接口D中然后让麻雀来实现而是应该隔离开让具备某种能力的类实现指定的接口。 合成复用原则Composite Reuse PrincipleCRP
合成复用原则定义尽量使用对象组合而不是继承来达到复用的目的。
简单来说就是类之间的关系少用继承尽量使用接口实现或者依赖注入的方式。例如有一个面试题如何解决ArrayList线程不安全的问题我所知道的有以下5个方法
1使用CopyOnWriteArrayList()
2使用Collections.synchronizedList()
3定义一个类MyArrayList继承ArrayList重写其方法每个方法用synchronized修饰
4定义一个类MyArrayList类里面定义一个ArrayList自定义List的增删改查方法用synchronized修饰方法里面调用ArrayList对应的方法
5使用Vector
重点是第三个、第四个方法的对比前者是继承需要重写父类的方法后者是设值注入调用ArrayList的方法显然后者更加灵活。 迪米特法则Law of DemeterLoD
迪米特法则又称最少知识原则原则简单来说就是指一个软件实体应当尽可能少地与其他实体发生相互作用。这样当一个模块修改时就会尽量少地影响其他的模块。
总结
本篇文章内容基本来自《设计模式》第2版清华大学出版社刘伟主编第1、2章