Java设计模式: UML 七大原则
UML
三种组成构件:事物、关系、图。

事物:类、对象等
图:uml可以画 类图、对象图、构件图、活动图等
关系:关联、聚合等。
类图
类:
类包括类名、属性、操作。
- 类名:字符串
- 属性:[可见性]属性名:类型[=默认值]
可见性:+、-、#、~表示 public private protected friendly - 操作: [可见性]操作名(参数列表)[:返回类型]

注意:
抽象类或抽象方法用斜体表示
如果是接口,则在类名上方加 <>
字段和方法返回值的数据类型非必需
静态类或静态方法加下划线
接口:

关系:
| 名字 | 特点 | 解释 | 例子 | 图标 |
|---|---|---|---|---|
| 依赖关系: | 弱。 | A类的方法中用到了B类 | setB(ClassB b):void | A虚线指向B |
| 关联关系: | 强关系 | 可以单向/双向。 | 老师学生。头和嘴巴。 | 实线箭头(单向双向或没有箭头) |
| 聚合关系: | 强。 | 属于关联关系, has | 学校和老师。 | A has B,A空心菱形,B箭头 |
| 组合关系: | 强。 | 属于关联关系,contains | 头和嘴巴。 | A contains B,A实心菱形,B箭头 |
| 泛化关系: | 耦合度最大。 | 继承 is | 人和学生。 | 子发出实线,父三角形 |
| 实现关系: | 接口实现了类。 | \ | 类发出虚线,接口三角形 |

七大原则
好的代码需要满足:代码复用、可扩展、
开闭原则:
当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。
抽象约束、封装变化.
里氏替换原则
何时该继承?
子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法
子类中可以增加自己特有的方法
当子类的方法重载父类的方法时,方法的前置条件(即方法的输入参数)要比父类的方法更宽松
当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的的输出/返回值)要比父类的方法更严格或相等。
依赖倒置原则
高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。
要面向接口编程,不要面向实现编程。
就是方法的形参类型定义为接口,而不是类。
单一职责原则
一个类应该有且仅有一个引起它变化的原因。
一个方法应该尽可能做好一件事情
接口隔离原则
将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。
比如将管理系统的功能(插入成绩、删除成绩、修改成绩、计算总分、计算均分、打印成绩信息、査询成绩信息等功能)分成3类(输入模块、统计模块和打印模块)。
迪米特法则
只和朋友交流。比如明星和经纪人交流,经纪人和粉丝/公司交流
合成复用原则
有先用聚合等关联关系来实现,其次才考虑使用继承关系来实现。
比如同样设计汽车类。
用继承:
汽车
汽油车 柴油车
红色汽油车 白色汽油车。。。
用聚合:
把颜色定义为汽车的一个属性。
总结
| 设计原则 | 一句话归纳 | 目的 |
|---|---|---|
| 开闭原则 | 对扩展开放,对修改关闭 | 降低维护带来的新风险 |
| 依赖倒置原则 | 高层不应该依赖低层,要面向接口编程 | 更利于代码结构的升级扩展 |
| 单一职责原则 | 一个类只干一件事,实现类要单一 | 便于理解,提高代码的可读性 |
| 接口隔离原则 | 一个接口只干一件事,接口要精简单一 | 功能解耦,高聚合、低耦合 |
| 迪米特法则 | 不该知道的不要知道,一个类应该保持对其它对象最少的了解,降低耦合度 | 只和朋友交流,不和陌生人说话,减少代码臃肿 |
| 里氏替换原则 | 不要破坏继承体系,子类重写方法功能发生改变,不应该影响父类方法的含义 | 防止继承泛滥 |
| 合成复用原则 | 尽量使用组合或者聚合关系实现代码复用,少使用继承 | 降低代码耦合 |
更多推荐
所有评论(0)