设计模式学习笔记1-设计模式概念

文章目录

    • 1 什么是设计模式(Design Pattern)?
    • 2 使用设计模式的目的
    • 3 设计模式的由来
    • 4 设计模式的两个主要用途
    • 5 设计模式的分类
      • 5.1 创建型模式
        • 含义
        • 举例
      • 5.2 结构型模式
        • 含义
        • 举例
      • 5.3 行为型模式
        • 含义
        • 举例
      • 5.4 J2EE模式
        • 含义
        • 举例
    • 6 设计模式的六大原则
      • 6.1 开闭原则
      • 6.2 里氏代换(Liskov Substitution)原则
      • 6.3 依赖倒转(Dependence Inversion)原则
      • 6.4 接口隔离(Interface Segregation)原则
      • 6.5 最少知道原则
      • 6.6 合成复用(Composite Reuse)原则
        • 聚合与合成的区别

1 什么是设计模式(Design Pattern)?

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的代码设计经验总结,它是在特定场景下,针对某类问题的通用解决方案,代表了最佳实践

2 使用设计模式的目的

  1. 可重用代码
  2. 让代码更容易被他人理解
  3. 保证代码的可靠性

3 设计模式的由来

GOF四人帮合著的《设计模式——可复用的面向对象软件设计元素》

主要基于的面向对象设计原则:

  1. 对接口编程而非对实现编程
  2. 优先使用对象组合而非继承

4 设计模式的两个主要用途

  1. 开发人员的共同平台

  2. 最佳的实践

5 设计模式的分类

5.1 创建型模式

含义

实例化对象的模式,提供了一种在创建对象时隐藏创建逻辑的方式,而非直接用new实例化对象,将对象的创建过程从使用者中解耦出来

举例

  • 简单工厂:依据传入的参数决定生产哪种对象产品

  • 单例模式:采用单例模式设计的类只有一个单例,并提供一个全局访问点

  • 原型模式:通过复制现有的实例来创建新的实例

5.2 结构型模式

含义

通过结合多个类或对象形成更大的结构,关注类和对象的组合

举例

  • 组合模式:将对象组合成树形结构

  • 装饰器模式:动态的给对象添加新的功能

  • 代理模式:为对象创建一个代理以便控制对这个对象的访问,典型的例子是java动态代理中的Proxy类

5.3 行为型模式

含义

关注对象之间的通信交互和操作策略等行为

举例

  • 责任链模式:将请求的发送者和接收者解耦,使一个请求能被多个对象处理,典型的例子是tomcat的Container容器处理请求的过程(请求被依次传递给Server对象、Host对象、Context对象以及Wrapper对象处理)

  • 迭代器模式:一种遍历访问聚合对象内部元素的方法,不暴露聚合对象的内部结构,典型的例子就是C++和java中的迭代器

  • 策略模式:定义一系列算法(操作策略),将它们封装起来,并可使其相互替换

5.4 J2EE模式

含义

特别关注表示层,由Sun公司主导

举例

  • MVC模式

  • 前端控制器模式

  • 数据访问对象(DAO)模式

6 设计模式的六大原则

6.1 开闭原则

对扩展开放,对修改关闭。目的是为了使软件易于扩展和维护。

6.2 里氏代换(Liskov Substitution)原则

凡是基类出现的地方,都可以用派生类去代替,该原则是继承复用的基石,也是对开闭原则的补充。实现开闭原则的关键是抽象化,派生类和基类的继承关系是抽象化的具体实现,LS原则正是对继承关系的规范

6.3 依赖倒转(Dependence Inversion)原则

针对接口编程,依赖于抽象而非具体,是开闭原则的基础。(名字的理解:抽象是依赖于具体,但要反过来依赖抽象编程才能具有良好的扩展性)

6.4 接口隔离(Interface Segregation)原则

两层含义:

  • 使用多个隔离的接口比使用单个接口要好
  • 降低类之间的耦合度

体现的思想:降低依赖,降低耦合

6.5 最少知道原则

一个实体应当尽量少地与其他实体之间发生相互作用,使得系统的各功能模块之间相对独立,还是为了降低耦合,便于扩展维护

6.6 合成复用(Composite Reuse)原则

尽量使用合成/聚合的方式,而不是使用继承来实现复用,原因还是在于使用合成/聚合的复用方式更灵活,类之间的耦合度更低;而继承复用会破坏系统的封装性(基类会将实现细节暴露给子类)。

一般而言,如果两个类之间是“Has-A”的关系应使用组合或聚合,如果是“Is-A”关系可使用继承。“Is-A"是严格的分类学意义上的定义,意思是一个类是另一个类的"一种”;而"Has-A"则不同,它表示某一个角色具有某一项责任。

聚合与合成的区别

  • 聚合(aggregation):表示一种“拥有”关系,部分聚合成整体且部分的生命周期可以大于整体,如班级和学生构成的聚合关系。
  • 合成(Composition):表示一种更强的“拥有”关系,部分与总体的生命周期是一致的,如房子和房间的关系

参考:

  1. 设计模式|菜鸟教程

  2. Java设计模式——合成/聚合复用原则

  3. JAVA设计模式总结之23种设计模式

你可能感兴趣的:(设计模式,设计模式)