类
类是指具有相同属性、方法和关系的对象的抽象,它封装了数据和行为,是面向对象程序设计(OOP)的基础,具有封装性、继承性和多态性等三大特性。
在 UML 中,类使用包含类名、属性和操作且带有分隔线的矩形来表示(如下图):
第一层:类名
第二层:属性
第三层:方法
注:“可见性”表示该属性对类外的元素是否可见,包括公有(Public)、私有(Private)、受保护(Protected)和朋友(Friendly)4 种,在类图中分别用符号+、-、#、~表示。
接口
接口(Interface)是一种特殊的类,它具有类的结构但不可被实例化,只可以被子类实现。它包含抽象操作,但不包含属性。它描述了类或组件对外可见的动作
类图
类图(ClassDiagram)是用来显示系统中的类、接口、协作以及它们之间的静态结构和关系的一种静态模型。它主要用于描述软件系统的结构化设计,帮助人们简化对软件系统的理解,它是系统分析与设计阶段的重要产物,也是系统编码与测试的重要模型依据
类之间的关系
依赖关系、关联关系、聚合关系、组合关系、泛化关系、实现关系
- 依赖(Dependency)关系是一种使用关系,它是对象之间耦合度最弱的一种关联方式,是临时性的关联。依赖关系使用带箭头的虚线来表示,箭头从使用类指向被依赖的类。如方法中对另一个对象的引用。
- 关联(Association)关系是对象之间的一种引用关系,用于表示一类对象与另一类对象之间的联系,如老师和学生、师傅和徒弟、丈夫和妻子等。关联关系是类与类之间最常用的一种关系,分为一般关联关系、聚合关系和组合关系。关联可以是双向的,也可以是单向的。箭头从使用类指向被关联的类。如属性中与另一个对象的互相引用。
- 聚合(Aggregation)关系是关联关系的一种,是强关联关系,是整体和部分之间的关系,是 has-a 的关系。聚合关系可以用带空心菱形的实线来表示,菱形指向整体。如属性中对另一个对象的引用。
- 组合(Composition)关系也是关联关系的一种,也表示类之间的整体与部分的关系,但它是一种更强烈的聚合关系,是 cxmtains-a 关系。组合关系用带实心菱形的实线来表示,菱形指向整体。如一个类的属性与另一个类的方法组合。
- 泛化(Generalization)关系是对象之间耦合度最大的一种关系,表示一般与特殊的关系,是父类与子类之间的关系,是一种继承关系,是 is-a 的关系。泛化关系用带空心三角箭头的实线来表示,箭头从子类指向父类。如子类继承父类
- 实现(Realization)关系是接口与实现类之间的关系。在这种关系中,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作。实现关系使用带空心三角箭头的虚线来表示,箭头从实现类指向接口。如实现接口。
1.开闭原则(Open Closed Principle,OCP)
软件实体应当对扩展开放,对修改关闭(Software entities should be open for extension,but closed for modification)
2.里氏替换原则(Liskov Substitution Principle,LSP
继承必须确保超类所拥有的性质在子类中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects)
即,尽量不要重写父类方法
3.依赖倒置原则(Dependence Inversion Principle,DIP)
高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions)
即,面向接口编程
4.单一职责原则(Single Responsibility Principle,SRP)
一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than one reason for a class to change)
5.接口隔离原则(Interface Segregation Principle,ISP)
客户端不应该被迫依赖于它不使用的方法(Clients should not be forced to depend on methods they do not use)
或,一个类对另一个类的依赖应该建立在最小的接口上(The dependency of one class to another one should depend on the smallest possible interface)
6.迪米特法则(Law of Demeter,LoD)
只与你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to strangers)
7.合成复用原则(Composite Reuse Principle,CRP)
它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。
如果要使用继承关系,则必须严格遵循里氏替换原则。合成复用原则同里氏替换原则相辅相成的,两者都是开闭原则的具体实现规范。
总结
这 7 种设计原则是软件设计模式必须尽量遵循的原则,各种原则要求的侧重点不同。其中,开闭原则是总纲,它告诉我们要对扩展开放,对修改关闭;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;单一职责原则告诉我们实现类要职责单一;接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合度;合成复用原则告诉我们要优先使用组合或者聚合关系复用,少用继承关系复用。