一、设计模式
1、什么是设计模式
设计模式是一套被反复使用、多数人知晓、代码设计经验的总结。
2、目的
设计模式的目的是为了让软件具有更好的代码重用性、可读性、可扩展性、可靠性,同时使程序间出现高内聚、低耦合的特性。
3、七大原则
(1)单一职责原则(Single-Responsibilitiy Principle(SRP))。
简单的说就是 对于一个类A,其只负责某项职责(功能),并不是指一个类只有一个方法。
比如某个人,其兼职了几个不同的工作,按照单一职责原则,每个工作应该都由一个专门的人来完成。
(2)接口隔离原则(Interface Segregation Principle(ISR))。
简单的说就是 对于一个类A,不应该依赖于不需要的接口,即类间的依赖关系需建立在最小的接口上。
比如,一个接口里面有10个抽象方法,当类A需要使用某个方法时,需要实现该接口,并重写10个方法。此时其余的9个方法,类A并不需要,按照接口隔离原则,可以将这个方法单独的抽出来写成一个接口B,然后让类A去实现接口B,此时类A只需重写一个方法即可。
(3)依赖倒置(倒转)原则(Dependence Inversion Principle(DIP))。
简单的讲 依赖倒置原则的中心思想是面向接口编程,高层模块不依赖与低层模块,且二者均依赖于抽象,其抽象不依赖于细节,应该细节依赖于抽象。
其中:
抽象指的是 接口 或者 抽象类, 细节指的是 具体的实现类。
【举例:普通的写法】 class Teacher{ } class Hospital{ // 高层依赖于低层 public void check(Teacher teacher){ // 采用具体的实现类,只能传入Teacher类的实例 } } 【举例:面向接口编程】 interface Person{ } class Teacher implements Person{ } class Doctor implements Person{ } class Hospital{ // 高层不依赖于低层,而依赖于抽象 public void check(Person person){ // 采用接口,方便复用,可以传入Teacher类或Doctor类的实例 } }
(4)里氏替换原则(Liskov Substitution Principle(LSP))。
简单的讲就是 任何父类能出现的地方,子类一定能出现,且子类可以扩展父类的功能,但是不能改变父类原有的功能。即继承时尽量不要重写父类的方法。
比如一个父类A,子类B,且子类B重写了父类A的某个方法,在一个类C中需要使用父类A的方法时,若此时传入的是子类B,则程序可能会出错。
(5)开闭原则(Open-Close Principle(OCP),核心原则)。
简单的讲就是 软件对扩展开放(代码提供方),对修改关闭(代码使用方),即对代码功能进行扩展时,不能修改原有代码。使用抽象类与接口对代码进行重构,当扩展代码功能时,实现抽象类或接口并实现相关方法即可。
(6)迪米特法则(Law of Demeter(LOD))。
又称为最小知道法则(Least Knowledge Principle (LKP))
简单的说就是 一个实体应尽量少的与其他实体之间发生相互作用(降低耦合),使系统功能模块相互独立。一个对象应该对其他对象有最少的了解,即不管你内部有多复杂,我能调用你的方法就行。
比如:一个类A的某个方法中出现某个类B,且对类B做了一些无关类A的操作,按照迪米特法则,需要将这些操作封装在类B的一个方法中,然后在类A中调用该方法。
(7)合成复用原则。
简单的说就是 尽量使用合成或者聚合的方式,少用继承。
4、常用设计模式分类(23种)
(1)三大类:
创建型模式(五种),
结构型模式(七种),
行为型模式(十一种)
(2)创建型模式:(强调对象创建时,如何去更好的设计)
工厂模式,抽象工厂模式,单例模式,建造者模式,原型模式。
(3)结构型模式:(设计更好的软件结构)
适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。
(4)行为型模式:(设计更好的方法调用模式)
策略模式,模板方法模式,观察者模式,迭代器模式,责任链(职责链)模式,命令模式,备忘录模式,状态模式,访问者模式,中介者模式,解释器模式。
二、UML图
1、什么是UML图
(1) Unified Modeling Language,统一建模语言,用来对软件密集系统进行可视化建模的一种语言。简单的说就是 帮助软件开发人员记录、交流的一个图形化语言。
(2)UML图本身是一组符号的规定,用于描述软件模型间各元素以及各元素间的联系。
2、UML分类
(1)用例图
(2)静态结构图:类图,对象图,包图,组件图,部署图。
(3)动态行为图:交互图(时序图、协作图)、状态图、活动图。
3、类图(常用)
(1)用于描述类与类之间的关系。UML的核心。
(2)元素:类、接口。
(3)关系:依赖、继承(泛化)、实现、关联、聚合、组合等。
(4)依赖:
若在某个类A中使用到类B,且若没有类B,类A编译会报错,则称A与B之间有依赖关系。
线条表示:虚线普通箭头("<",">")。
(5)继承(泛化):
属于依赖关系的一种特例,如果类A继承了类B,则称A与B间存在泛化关系。
线条表示:实线空心三角箭头。
(6)实现:
属于依赖关系的一种特例,如果类A实现了类B,则称A与B间存在实现关系。
线条表示:虚线空心三角箭头。
(7)关联:
属于依赖关系的一种特例,如果类A与类B间有联系。比如类B作为类A的成员变量,则称A与B间存在关联关系。
线条表示:实线(直线),普通箭头("<",">")可选。如果强调方向,则加一个普通箭头。否则只需要一条实线。
(8)聚合:
属于关联关系的一种特例,如果类A与类B间可以分离且可以独立存在,则称A与B间存在聚合关系。比如:人与衣服,可以分离,则为聚合关系。
线条表示:实线空心菱形箭头。
(9)组合:
属于关联关系的一种特例,如果类A与类B间不可以分离,则称A与B间存在组合关系。比如:人与人头,不可分离,则为组合关系。
线条表示:实线实心菱形箭头。
注:
eclipse下生成Java类图和时序图,生成UML图,参考地址: https://blog.csdn.net/qq_21383435/article/details/79890884
在线编辑UML图的工具(ProcessOn):https://www.processon.com/