设计模式总结

概述

软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。

设计模式是软件设计中常见问题的典型解决方案。 每个模式就像一张蓝图, 你可以通过对其进行定制来解决代码中的特定设计问题。

文章目录

  • 概述
    • 设计模式目的
    • 设计模式常用的七大原则
      • 单一职责原则
      • 接口隔离原则
      • 依赖倒转(倒置)原则
      • 里氏替换原则
      • 开闭原则
      • 迪米特法则
      • 合成复用原则
      • 小结
  • UML类图
    • 类之间的关系
      • 依赖关系
      • 泛化关系
      • 实现关系
      • 关联关系
      • 聚合关系
      • 组合关系
    • IDEA与Eclipse 使用UML类图
  • 设计模式分类
    • 根据目的来分
    • 根据作用范围来分
  • 23种设计模式
    • 创建型模式
      • 单例模式
      • 原型模式
        • 模式的结构
        • 类图
        • 对象的拷贝
          • 浅拷贝
          • 深拷贝
        • 原型模式的注意事项和细节
        • 适用场景
      • 建造者模式
        • 类图
          • 模式结构
          • 优缺点
          • 代码
          • 建造者模式的注意事项和细节
      • 工厂模式
        • 简单工厂
          • 模式结构
          • 类图
          • 主要代码
          • 优缺点
          • 使用场景
        • 工厂方法
          • 模式结构
          • 类图
          • 代码实现
      • 抽象工厂模式
        • 模式结构
        • 类图
        • 模式的应用场景
        • 与工厂模式的区别
        • 与建造者模式的区别
        • 代码实现
    • 结构型模式
      • 适配器模式
      • 桥接模式
        • 模式结构
        • 类图
        • 优缺点
        • 应用场景
        • JDBC 中的桥接模式
        • 示例代码
      • 装饰者模式
        • 模式结构
        • 类图
        • IO结构中的装饰者模式
        • 优缺点
        • 应用场景
        • 示例代码
      • 组合模式
        • 模式结构
        • 类图
        • 优缺点
        • 应用场景
        • 示例代码
      • 外观模式
        • 模式结构
        • 类图
        • 优缺点
        • MyBatis中的外观模式
        • 应用场景
        • 示例代码
      • 享元模式
        • 模式结构
        • 类图
        • 优缺点
        • 应用场景
        • 示例代码
      • 代理模式
    • 行为型模式
      • 模版模式
        • 模式结构
        • 类图
        • Spring框架中的模板模式
        • 优缺点
        • 应用场景
        • 示例代码
      • 解释器模式
        • 模式结构
        • 类图
        • 优缺点
        • 应用场景
        • Spring框架中的解释器模式
        • 示例代码
      • 命令模式
      • 访问者模式
      • 迭代器模式
      • 观察者模式
      • 中介者模式
      • 备忘录模式
      • 状态模式
      • 策略模式
      • 职责链模式

设计模式目的

  1. 代码重用性 (即:相同功能的代码,不用多次编写)
  2. 可读性 (即:编程规范性, 便于其他程序员的阅读和理解)
  3. 可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护)
  4. 可靠性 (即:当我们增加新的功能后,对原来的功能没有影响)
  5. 使程序呈现 高内聚(模块与模块之间紧密联系), 低耦合(功能与功能之间依赖性低)的特性

设计模式常用的七大原则

  1. 单一职责原则
  2. 接口隔离原则
  3. 依赖倒转(倒置)原则
  4. 里氏替换原则
  5. 开闭原则
  6. 迪米特法则
  7. 合成复用原则

单一职责原则

对类来说的,即一个类应该只负责一项职责。

单一职责原则注意事项和细节

  1. 降低类的复杂度,一个类只负责一项职责。
  2. 提高类的可读性,可维护性
  3. 降低变更引起的风险
  4. 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则; 只有类中方法数量足够少,可以在方法级别保持单一职责原则

接口隔离原则

客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。
将接口Interface 拆分为独立的几个接口, 让需要依赖的类分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则

接口隔离原则时,应该根据以下几个规则来衡量。

  • 接口尽量小,但是要有限度。一个接口只服务于一个子模块或业务逻辑。
  • 为依赖接口的类定制服务。只提供调用者需要的方法,屏蔽不需要的方法。
  • 了解环境,拒绝盲从。每个项目或产品都有选定的环境因素,环境不同,接口拆分的标准就不同深入了解业务逻辑。
  • 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

UML类图

UML 建模的核心是模型,模型是现实的简化、真实系统的抽象。UML 提供了系统的设计蓝图。当给软件系统建模时,需要采用通用的符 语言,这种描述模型所使用的语言被称为建模语言。在 UML 中,所有的描述由事物、关系和图这些构件组成。下图完整地描述了所有构件的关系。其中类图是其最重要的部分也是最常用的图

在UML类图中

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

类之间的关系

依赖、泛化(继承)、实现、关联、聚合与组合

依赖关系

只要是在类中用到了对方,那么他们之间就存在依赖关系。如果没有对方,连编绎都通过不了 以下5中情况都是依赖关系

  1. 类中用到了对方
  2. 如果是类的成员属性
  3. 如果是方法的返回类型
  4. 是方法接收的参数类型
  5. 实现关系

    实现关系实际上就是A类实现B接口,它是依赖关系的特例。在这种关系中,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作。

    聚合关系

    聚合关系表示的是整体和部分的关系,代表整体与部分可以分开。聚合关系是关联关系的特例,所以他具有关联的导航性与多重性

    IDEA与Eclipse 使用UML类图

    在IDEA中可以可以右键包然后选择Diagrams 选择类图,也可以使用快捷键crtl+alt+shift+u来显示类图,使用IDEA自带的需要先设计好程序后才能显示类图,即无法自己画类图,如果需要自己画类图则安装插件PlantUML Itegration

    使用PlantUML Itegration 制作的建造者模式的UMl类图示例:具体使用规则参考 PlantUML Itegration插件 使用规则

    根据作用范围来分

    根据模式是主要用于类上还是主要用于对象上来分,这种方式可分为类模式和对象模式两种。
    类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。GoF中的工厂方法、(类)适配器、模板方法、解释器属于该模式。
    对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。GoF 中除了以上 4 种,其他的都是对象模式。

    对象的拷贝

    浅拷贝

    浅拷贝就是只拷贝了对象的基本类型值和引用值,但被复制的对象引用类型的属性仍然指向原来的对象。说白了拷贝对象仅仅拷贝了原对象属性值的一个引用,此引用仍然指向相同的地址
    String 除外 ,实现Cloneable 覆写Clone 方法 这个就是浅拷贝
    String的内容保存在常量池中,所以对其做修改只是改变了成员变量所引用的常量池的串,不会影响其它拷贝对象中的该成员

    深拷贝

    就是对所有的属性都独立地复制一份。对于基本类型属性即是复制一份值(成员变量自会提供独立的空间),而对于引用类型的属性就是重新建立了一个一模一样的对象,引用值不再相同(不再指向同一个对象)

  • 实现Cloneable 一层一层覆写Clone 方法 也可以实现深度拷贝
    如果想实现引用数据的类型的属性也是引用类型的对象拷贝,则需要使用深度拷贝

  • 直接使用Java的clone()可以实现深拷贝,

  • 使用序列化实现深拷贝是一种好的方式,也可以考虑使用一些其它工具,如Spring的BeanUtils工具

public class Sheep implements Cloneable {    private String name;    private int age;    private String color;    private String address = "蒙古羊";    public Sheep friend; //是对象, 克隆是会如何处理    public Sheep(String name, int age, String color) {super();this.name = name;this.age = age;this.color = color;    }    public String getName() {return name;    }    public void setName(String name) {this.name = name;    }    public int getAge() {return age;    }    public void setAge(int age) {this.age = age;    }    public String getColor() {return color;    }    public void setColor(String color) {this.color = color;    }    public void setFriend(Sheep friend) {this.friend = friend;    }    public Sheep getFriend() {return friend;    }    @Override    public String toString() {return "Sheep [name=" 

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年5月15日
下一篇 2021年5月15日

相关推荐