设计模式概论与原则 & 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();
  
}
原文地址:https://www.cnblogs.com/moveofgod/p/12496839.html