zoukankan      html  css  js  c++  java
  • 设计模式概论与原则 & 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();
      
    }
  • 相关阅读:
    配置OSPF负载分担
    IPv4静态路由与NQA联动
    静态路由实现路由负载分担
    静态路由实现主备备份
    (一)非整数幂情形下的广义牛顿二项式定理
    小小知识点(二十三)被科研人员忽略的ORCID —— 如何注册和使用?意义何在?
    小小知识点(二十二)word 排版技巧大全
    小小知识点(二十一)Mathtype怎么批量更改全文的公式格式
    小小知识点(十九)如何破解安装编辑PDF文本的软件——福昕编辑器和Adobe acrobat DC
    (三十二)5G前传、中传和回传
  • 原文地址:https://www.cnblogs.com/moveofgod/p/12496839.html
Copyright © 2011-2022 走看看