设计模式概论与原则 & UML类图
Posted 神之一招
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式概论与原则 & UML类图相关的知识,希望对你有一定的参考价值。
设计模式: 对软件编程中普遍存在的问题的整体解决方案. (面向对象编程), 为了将来更好的扩展(修改)
后续所有的 Client 本身不是设计模式的一部分, 它是客户,调用这个设计模式.
为什么要用设计模式
1) 代码重用性 (相同功能的代码, 不用重复编写)
2) 可读性(编程规范性,便于其他程序的阅读和理解)
3)可扩展(当需要增加新的功能时,非常方便也称为可维护性)
4)可靠性(增加新的功能后,对原来的功能没有影响)
5)高内聚,低耦合(模块内部紧密,模块和模块之间依赖性低, 如果1个模块出了问题,不要把问题带到另一个模块)
每章内容
1. 抛出问题, 先代码实现(非设计模式方式)
2. 具体设计模式说明和解释(生活应用场景)
3. 代码实现
4. UML图 (原理与角色)
5. 具体源码应用 & 分析
原则
1. 单一职责原则
对类来说, 一个类应该负责一个职责, 降低变更带来的风险. 如果 A 类负责2个不同的职责, 职责1, 职责2, 当职责1需求变更而改变 A 时,
可能造成职责2执行错误,所以要将类拆分成不同职责的 A1 和 A2.
2. 接口隔离原则
一个类对另一个类的依赖, 应该是建立在最小的接口上. 类A 通过接口 ITarget 对类 B(实现接口的类) 有依赖, 接口中有5个方法, 但是 A 实际上
只需要其中3个, 但是, B 需要实现全部接口中的5个方法.
3. 依赖倒转原则
要依赖抽象(接口 / 抽象类), A 依赖接口, B 具体实现的是接口. 因为接口稳定. 抽象的目的在于制定好规范. 而抽象不会涉及任何具体操作.
尽量针对接口编程
4. 里氏替换原则
用来指导继承, 里氏替换原则:引用基类的地方能透明使用其子类进行替换(子类尽量不要重写父类的方法).
5. 开闭原则OCP(最重要)
一个类, 函数 或者模块,对扩展开放(提供方提供新方法),对修改关闭(使用方不用修改之前的代码). 说白了, 可以扩展新的, 且不用修改原有的.
这样,当你增加新功能(扩展)时, 就不会影响之前的代码(因为没有修改),这样, 别人引用你原有代码的人就不用担心(因为没有修改)
举例: 比如新增加一个图形时(长方形,正方形,圆形),增加新图形,对之前的没有影响.(不是通过 if-else)
6. 迪米特法则 (降低类之间的耦合)
一个对象应该与其他对象保持最少的了解, 迪米特法则又叫最少知道原则, 类对外提供的只能是 public 方法. 只与直接朋友进行通信.
直接朋友的概念: B类时 A 类的成员变量, B类是 A类中某个方法的参数, B类 是 A 类中某个方法的返回类型.
所以, 基本上可以理解为不要在方法里定义对象(陌生类), 如果要用到, 尽量把它变成成员变量, 或者是参数传入, 或者是由返回类型需要在内部定义.
7. 合成复用原则
尽量使用 组合 / 聚合 has-a, 尽量少的使用继承 is-a.
UML类图
在 eclipse 中, 也可以通过拖拽源码的方式, 直接把类似 class, interface 等拖拽到图形编辑框中.
类图中各种关系的含义
Dependency 依赖: A 类指向 B类, 表示 A 使用 B 提供的方法 等. (A 也可以通过接口依赖于B类对接口的实现)
Association关联: 表示类和类之间的连接,使得一个类知道另一个类的方法,可以是双向的. 1:1, 1:n 等
Generalization 泛化: 子类或者子接口继承父类或者父接口. (可以理解为继承关系)
Realization 实现: 是指一个类实现 一个或多个接口.
Aggregation 聚合(has-a): 表示整体与部分的关系,带菱形空心箭头的指向整体. (部分可以离开整体)
Composite 组合(has-a): 整体与部分的关系,但是部分不可以离开整体, 带菱形实心箭头的指向整体
关联关系的3种: 关联, 聚合, 组合, 实际上这3中都是关联关系, 那有什么不同呢?
Association: 普通关联关系
Aggregation 聚合, 书架上可以有 0...n 本书, 书是书架上的一部分,(即使书架上没有书, 书架也可以单独存在), 且book 也是可以独立的.
Composite 组合, Head 类只能存在于 Human 中, 不能独立出来. (整体和部分是不可分开的(无论对主体还是部分都是一样))
比如当你新建一个对象 new Human, 那么这时就必须自动实例化 Head Body 等(在类定义中, 直接实例化, 就是这种关系)
Public class Human { private Head head = new Head(); private Body body = new Body(); private Arm arm = new Arm(); private Leg leg = new Leg(); }
以上是关于设计模式概论与原则 & UML类图的主要内容,如果未能解决你的问题,请参考以下文章