zoukankan      html  css  js  c++  java
  • 设计模式

    一、设计模式的目的

    懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要。

    1. 代码重用性(相同功能的代码不需要多次编写)
    2. 可读性(规范编程,便于其他开发人员阅读和理解)
    3. 可扩展性(当需要增加新功能的时候,非常方便)
    4. 可靠性(当我们增加新功能后,对原有的功能没有影响)
    5. 使程序呈现高内聚、低耦合的特性(高内聚:尽可能类的每个成员方法只完成一件事(最大限度的聚合); 低耦合:减少类内部,一个成员方法调用另一个成员方法。)

    二、设计模式的七大原则

    ​ 设计模式原则就是开发者在编程时应当遵守的原则,也是各种设计模式的基础(即:设计模式为什么这么设计的依据)。

    • 单一职责原则
    • 接口隔离原则
    • 依赖倒置原则
    • 里氏替换原则
    • 开闭原则
    • 迪米特法则
    • 合成复用原则

    1.单一职责原则

    对类来说,一个类应该只负责一项职责。例如,类A负责两个不同的职责:职责1,职责2;当职责1需求改变的时候,可能会导致职责2出错,所以应当执行单一职责原则,将类A的粒度分解为A1、A2。

    注意事项与细节:

    1)降低类的复杂度,一个类只负责一项职责
    2)提高类的可读性、可维护性
    3)降低变更引起的风险
    4)通常情况下,我们应当遵循单一职责原则,除非逻辑足够简单


    2.接口隔离原则

    客户端不应该依赖他不需要的接口,即一个类对另一个类的依赖应该建立在最小接口上


    3.依赖倒置原则

    1)高层模块不应该依赖低层模块,二者都应该依赖其抽象
    2)抽象不应该依赖细节,细节应该依赖抽象
    3)依赖倒置原则的中心思想是面向接口编程
    4)依赖倒置原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构稳定得多。在java中,抽象指的是接口或抽象类,细节就是具体的实现类。
    5)使用接口或抽象类的目的是制定好规范,将具体的细节交给他们的实现类或子类去完成

    注意事项与细节:

    1)低层模块尽量都有抽象类或接口,这样程序稳定性更好
    2)变量的声明类型尽量都是抽象类或接口,这样我们的变量引用和实际对象间就有一个缓冲层,更利于程序的优化和扩展
    3)继承时遵循里氏替换原则


    4.里氏替换原则

    关于面向对象中的继承性的思考:

    • 继承包含这样一层含义:父类中定义好的方法,实际上是制定了一些契约,虽然它不强制要求子类遵循这些契约,但如果子类对这些已经实现的方法随意修改,则会造成整个继承体系的混乱
    • 继承给程序带来便利的同时,也带来了一些弊端,比如使用继承会给程序带来侵入性,程序可移植性降低,增加了类与类之间的耦合,如果一个类被其它类继承,那么这个类的每一次改动都要考虑到其子类

    因此,我们需要遵循里氏替换原则,即:

    1)所有引用基类的地方必须能够透明的使用其子类的对象
    2)子类尽量不要重写父类的方法
    3)在适当的情况下,可以通过聚合、组合、依赖来解决问题


    5.开闭原则

    开闭原则是编程中最基础、最重要的设计原则,当我们需要对一个程序进行扩展的时候,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化,编程中遵循其他原则,以及使用设计模式的目的就是遵顼开闭原则。

    6.迪米特法则

    1)一个对象应该对其他对象保持最少的了解
    2)类与类关系越密切,耦合度越高
    3)最少知道原则,即一个类对自己依赖的类知道的越少越好,也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部,对外只提供public方法
    4)迪米特法则还有个更简单的定义:只与直接的朋友通信,直接的朋友

    注意事项与细节:
    迪米特法则的核心是降低类之间的耦合,注意,是降低,并不是要求类与类之间完全没有依赖

    7.合成复用原则

    原则是尽量使用合成/聚合的方式,不使用继承的方式

    核心思想:
    1)找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
    2)针对接口编程,而不是针对实现编程
    3)为了交互对象之间的松耦合设计而努力

    三、UML类图

    用于描述系统中类(对象)本身的组成和类(对象)之间的各种静态关系,类之间的关系有:依赖、泛化(继承)、实现、关联、聚合、组合。

    图片来源:https://mp.weixin.qq.com/s/N92K9WwvHdpbej2btC-ofA

    如上图所示:

    • 依赖关系:只要类中使用到了对方,它们就是依赖关系,用虚线箭头表示
    • 关联关系:类与类之间的关系,有单向一对一和双向一对一,用实线箭头表示
    • 泛化关系:其实就是继承关系,用实线三角表示
    • 实现关系:通俗来说就是实现接口,用虚线三角表示
    • 聚合关系:表示整体和部分的关系,他们之间可以相互分开,用是实线空心菱形表示
    • 组合关系:表示整体和部分的关系,他们之间不可以相互分开,用是实线实心菱形表示

    这六种关系的其他五种的本质都是依赖关系,我们可以细分成这六种


    p.s. 所有代码和笔记均可在 我的GitHub 中获取,如果对您有帮助的话,可以点个 star 支持一下 ⭐

  • 相关阅读:
    jdk动态代理底层实现
    spring-FactoryBean
    大型网站技术架构 核心原理与案例分析 pdf
    实战JAVA虚拟机 JVM故障诊断与性能优化 pdf
    《实战Java高并发程序设计》pdf
    mysql-注意点
    Json入门
    inflate, findViewById与setContentView的区别与联系
    提高编程能力的7条建议
    JDBC之一:JDBC快速入门
  • 原文地址:https://www.cnblogs.com/songjilong/p/12397957.html
Copyright © 2011-2022 走看看