文章目录
- 参考
- 面向对象的设计原则
- 创建型模式
- 结构型模式
- 行为型模式
- UML
- 视图
- 图(Diagram)
- 模型元素(Model Element)
- 通用机制
- 类之间的关系
- 关联关系
- 复杂!!
- 聚合关系
- 组合关系
- 依赖关系
- 泛化关系
- 接口与实现关系
参考
https://github.com/faif/python-patterns
-
封装
对象的行为对于外部世界来说是不可见的,或者说对象的状态信息是私密的。
客户端不能通过直接操作来改变对象的内部状态。相反,客户端需要通过发送消息来请求对象改变其内部状态。对象可以根据请求的类型,通过特定的成员函数(例如get和set)改变它们的内部状态,以做出相应的响应。 -
多态
多态有两种类型。对象根据输入参数提供方法的不同实现。不同类型的对象可以使用相同的接口。 -
继承
继承表示一个类可以继承父类的(大部分)功能。
继承被描述为一个重用基类中定义的功能并允许对原始软件的实现进行独立扩展的选项.
继承可以利用不同类的对象之间的关系建立层次结构。与Java不同,Python支持多重继承(继承多个基类) -
抽象
它提供了一个简单的客户端接口,客户端可以通过该接口与类的对象进行交互,并可以调用该接口中定义的各个方法。
它将内部类的复杂性抽象为一个接口,这样客户端就不需要知道内部实现了。 -
组合
它是一种将对象或类组合成更复杂的数据结构或软件实现的方法。
在组合中,一个对象可用于调用其他模块中的成员函数,这样一来,无需通过继承就可以实现基本功能的跨模块使用。
面向对象的设计原则
-
开放/封闭原则规定,类或对象及其方法对于扩展来说,应该是开放的,但是对于修改来说,应该是封闭的。
- 现有的类不会被修改,因此退化的可能性较小。
- 它还有助于保持以前代码的向后兼容性
-
控制反转原则是指,高层级的模块不应该依赖于低层级的模块,它们应该都依赖于抽象。细节应该依赖于抽象,而不是抽象依赖于细节
- 消弱了模块间的紧耦合,因此消除了系统中的复杂性/刚性。
- 由于在依赖模块之间有一个明确的抽象层(由钩子或参数提供),因此便于通过更好的方式处理模块之间的依赖关系。
-
接口隔离
-
单一职责
-
替换原则,派生类必须能够完全取代基类。它还建议派生类应该尽可能对基类封闭,以至于派生类本身可以替换基类,而无需修改任何代码
上下文
- 参与者:它们是在设计模式中用到的类。类可以在模式中扮演不同的角色,以完成多个目标。
- 非功能需求:诸如内存优化、可用性和性能等需求都属于此类型。由于这些因素影响整个软件解决方案,因此至关重要。
- 权衡
- 结果
创建型模式
- 它们致力于设计出能够通过组合获得更强大功能的对象和类的结构。
- 重点是简化结构并识别类和对象之间的关系。
- 它们主要关注类的继承和组合。
结构型模式
- 它们致力于设计出能够通过组合获得更强大功能的对象和类的结构。
- 重点是简化结构并识别类和对象之间的关系。
- 它们主要关注类的继承和组合。
行为型模式
行为型模式具有下列性质。• 它们关注对象之间的交互以及对象的响应性。• 对象应该能够交互,同时仍然保持松散耦合。
UML
- 关联关系
- 双向
- 单向
- 自关联
- 多重
- 在关联直线上用一个数字或一个数字范围表示
- 聚合
- 关系表示整体与部分的关系。在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在
- 空心菱形,直线
- 组合
- 整体与部分同生共死
- 实心菱形,直线
- 依赖关系
- 体现在某个类的方法使用另一个类的对象作为参数
- 带箭头的虚线
- 泛化关系
- 继承
- 空心三角形,直线
- 接口与实现
- 空心三角形,虚线
视图
UML视图包括用户视图、结构视图、行为视图、实现视图和环境视图。其中,用户视图以用户的观点表示系统的目标,它是所有视图的核心,用于描述系统的需求;结构视图表示系统的静态行为,描述系统的静态元素,如包、类与对象,以及它们之间的关系;行为视图表示系统的动态行为,描述系统的组成元素(如对象)在系统运行时的交互关系;实现视图表示系统中逻辑元素的分布,描述系统中物理文件以及它们之间的关系;环境视图表示系统中物理元素的分布,描述系统中硬件设备以及它们之间的关系
图(Diagram)
模型元素(Model Element)
同一个模型元素都必须保持相同的意义并具有相同符号。
通用机制
类图和用例图是使用频率最高的两种 UML 图。用于描述系统中所包含的类以及它们之间的相互关系。
在设计模式中,可以使用类图来描述一个模式的结构并对每一个模式实例进行分析。
类图(Class Diagram)是用出现在系统中的不同类来描述系统的静态结构,主要用来描述不同的类以及它们之间的关系。
类之间的关系
关联关系
关联 association, 是类与类之间最常用的一种关系,是一种结构化的关系。
用实线连接
在使用类图表示关联关系时可以在关联线上标注角色名,一般使用一个表示二者之间关系的动词或者名词表示角色名(有时该名词为实例对象名),关系的两端代表两种不同的角色。因此,在一个关联关系中可以包含两个角色名,角色名不是必需的,可以根据需要增加,其目的是使类之间的关系更加明确。
-
双向关联
-
单向关联
复杂!!
聚合关系
表示整体与部分的关系。
用带空心菱形的直线表示。
在代码实现聚合关系时,成员对象通常作为构造方法、Setter方法或业务方法的参数注入整体对象中。
组合关系
也表示整体与部分的关系。但在组合关系中整体对象可以控制成员对象的生命周期。
用带实心菱形的直线表示。
依赖关系
依赖(Dependency)关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。
泛化关系
泛化(Generalization)关系也就是继承关系,用于描述父类与子类之间的关系,父类又称作基类或超类,子类又称作派生类。在UML中,泛化关系用带空心三角形的直线来表示。
接口与实现关系
类与接口之间的实现关系用带空心三角形的虚线来表示。