可信设计
软件建模
原则
模型是抽象的,需要通过不同视角来表示:
- 外部视角
- 交互视角
- 结构化视角
- 行为视角
方法
工具:UML
UML组成:事物(点)、关系(线)、图(面)
事物:结构事物、行为事物、组织事物、辅助事物
关系:关联、依赖、泛化、实现
图:动态图和静态图
9种UML模型图:用例图、类图、对象图、状态图、活动图、顺序图、合作图、组件图、部署图
用例图
用例图在需求分析阶段设计,描述系统的功能(what
)。
首先确定参与者,每个用例是系统的一个功能单元。
用例间有包含(include
)和扩展(extend
)两种关系,参与者存在泛化(generalization
)关系。
类图
泛化(generalization)是一种继承关系(is-a)(实线三角形)。
实现(realization)是一种类与接口关系(虚线三角形)。
依赖(dependency)是一种使用关系(虚线箭头,需要的时候才用到,函数参数)。
关联(association)是一种拥有关系(has-a)(实线箭头,与自身生命周期一样,平等类,成员变量)。
聚合(aggregation)是一种特殊的关联关系,将个体聚集成整体(实线空心菱形,借阅者有多条借阅记录)。
组合是(composition
)一种整体和局部的关系,比聚合更紧密(实线实心菱形,借阅记录必须有相关书籍信息)。
六种关系的依赖强弱:泛化>实现>组合>聚合>关联>依赖。
tips:箭头指向范围较小的类。
顺序图
活动图
四种基本模型元素:活动(activie)、活动流(activity line)、控制符(control node)、泳道(swimming line)
控制符表示分支和条件。
泳道一般用于表示并发。
状态图
状态(state):
事件(event):事件引发状态变迁,包括信号事件、调用事件、改变事件、时间事件。
转换(transition):对外界发生的事件所做出的反应。
设计模式
所有的设计原则和设计模式都是为了更容易的实现高内聚低耦合。
正则四原则
- 最小化重复
- 分离变化
- 缩小依赖范围
- 向稳定方向依赖
solid原则
单一职责(SRP):一个类只做一件事。
开闭原则(OCP):向扩展开放/向修改关闭。
里氏替换原则(LSP):子类能替换父类。
接口分离原则(ISP):依赖接口,不依赖实现。
依赖倒置(DIP):接口为稳定的契约,双方都依赖抽象,不依赖具体实现;上层定义接口,下层实现接口。
创建型模式
工厂方法Factory Method
隔离创建对象的细节,使得创建对象的行为可扩展
抽象工作Abstract Factory
该模式抽象出创建一组相关对象的接口,其中每个方法即为factory method
创建者Builder
与factory不同的是,该模式包含了对象构造的若干过程,因此天然地与template结合
原型Prototype
用于以某个对象为模子创建一个新对象的场景,例如幻灯片中的母版与普通页、对象的克隆
单例
结构型模式
适配器Adapter
处理遗留系统的不二法宝,也可以用空方法实现接口作为抽象父类
外观Facade
封装扇出,利用树状结构减少调用者的复杂度
桥接Bridge
使用关联代替继承,解决类多维度的扩展导致的类爆炸的问题
组合Composite
将组件组装为整体使用
装饰Decorator
常见于各种wrapper,常用于在原函数执行前后做一些额外的工作
享元Flyweight
复用变化少的对象
代理Proxy
是原对象的一个完整的替代品
行为型模式
观察者Observer
订阅/发布模型,用于事件驱动的设计
责任链Chain of Responsibility
一组对象按照既定的顺序关联起来,依次处理请求,其中任一对象都有权停止调用传递
模板方法Template Method
框架与钩子
解释器Interpreter
一般用于解释执行自定义的某种语法
命令Command
将行为抽象和解耦
迭代器Inteator
封装数据的访问行为(顺序、可见性等)
备份录Memento
将当前对象的状态信息保存为另一个对象,使得当前对象可以基于状态镜像快速恢复原状态
中介者Mediator
用一个中介对象来封装一系列的交互;新增一个模块处理两个模块的交互
状态State
封装FSM(有限状态机)的状态与状态迁移,每个状态定义了自身的输入与状态迁移
策略Strategy
使用接口即使用strategy,用于隔离变化
访问者Visitor
数据与行为分离方法。通过这种分离,可达到一个被访问者动态添加新的操作而无需做其他的修改的效果