摇摇晃晃的设计模式
UML 基础
UML 是统一建模语言,一种为面向对象系统的产品进行说明、可视化和编制文档的标准语言。
事物
事物是抽象化的最终结果,分为:
- 结构事物:模型中的静态部分,用以呈现概念或实体的表现元素
- 行为事物:UML 模型中的动态部分
- 分组事物:目前只有一种,就是包(Package)
- 注释事物:注解
结构事物
- 类(Class):具有相同属性、方法、关系和语义的对象的集合
- 接口(Interface):指一个类或构件的一个服务的操作集合。它仅仅定义了一组操作的规范,并没有给出这个操作的具体实现
- 用例(Use Case):指对一组动作序列的描述,系统执行这些动作将产生一个对特定的参与者有价值且可观察的结果
- 协作(Collaboration):定义元素之间的相互作用
- 组件(Component):描述物理系统的一部分
- 活动类(Active Class):指对象有一个或者多个进程或线程
- 节点(Node):定义为运行时存在的物理元素
行为事物
- 交互(Interaction):包括一组元素之间的信息交换
- 状态机(State Machine):由一系列对象的状态组成
关系(从强到弱)
- 泛化(继承):子类继承父类的所有功能
- 实现:类实现了接口,类中的方法实现了接口声明的所有方法
- 组合:整体与部分有一致的生存期,同生共死
- 聚合:整体与部分的关系,成员可以脱离整体独立存在
- 关联:类与类之间最常用的关系
- 依赖:是一种使用关系
设计模式六大原则
1. 开闭原则(Open Close Principle)
对扩展开放,对修改关闭。指一个软件实体如类、模块和函数应该对扩展开放、对修改关闭。强调的是用抽象构建框架,用实现扩展细节,可以提高软件系统的可复用性以及可维护性。
核心思想:面向抽象编程。
2. 里氏代换原则(Liskov Substitution Principle)
任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用。
是对开闭原则的补充。
3. 依赖倒转原则(Dependence Inversion Principle)
高层模块不应该依赖底层模块,二者应该依赖其抽象,细节应该依赖抽象。
针对接口编程,依赖于抽象而不依赖于具体。
注入方式:构造器注入、setter 注入
4. 接口隔离原则(Interface Segregation Principle)
使用多个隔离的接口,比使用单个接口要好。降低类之间的耦合度。
5. 迪米特法则(Demeter Principle)
最少知道原则:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
6. 合成复用原则(Composite Reuse Principle)
尽量使用合成/聚合的方式,而不是使用继承。
时序图
时序图,描述对象之间消息的发送顺序,强调时间顺序。
- 横轴:对象
- 纵轴:时间
- 消息:用箭头表示
- 生命线:用竖虚线表示
- 控制焦点:又称激活期,表示时间段
组合片段
- 抉择(Alt):互斥选择,相当于 if/else
- 选项(Opt):可能发生或不发生的序列
- 循环(Loop):片段重复
- 并行(Par):并行处理,相当于多线程
设计模式 vs 框架
- 框架:可以用代码表示,不仅能被学习,也能被直接执行和复用
- 设计模式:只有其实例才能表示为代码,每次被复用时都需要实现
- 框架是特例化的:总是针对一个特定的应用领域
- 设计模式更加抽象:一个典型的框架包括多个设计模式
P22:框架是面向对象系统获得的最大复用的方式。较大的面向对象应用将会由多层彼此合作的框架组成。
