java设计模式-----主目录-----持续更新

学习设计模式前必须知道的东西
  1. 看待设计模式,要站在更大的角度(代码重用性、可读性、可扩展性、可靠性、程序高内聚,低耦合)来综合考虑看待,而不是功能实现的角度看待,不要觉得实现一个功能没必要这么麻烦
  1. 文章中给出的设计模式类图都是标准的实现方式,并不一定要完全遵守标准,所以只要设计思想符合,一个设计模式有多种实现方式,尤其是看别人源码的时候,不要用标准类图死扣
源码位置
码云:https://gitee.com/yin_zhipeng/design_mode.git
GitHub:
我们会通过UML类图来描述设计模式的逻辑关系,不会的参考我的另一篇文章
https://blog.csdn.net/grd_java/article/details/122258344

在这里插入图片描述

设计模式
  1. 软件工程中,设计模式(design pattern)是对软件设计中普遍存在,反复出现的各种问题,提出的解决方案。
  2. 这个术语由埃里希-伽玛(Erich Gamma)等人于1990年才从建筑设计领域引入到计算机科学的
核心思想
  1. 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起
  2. 针对接口编程,而不针对实现编程
  3. 为了交互对象之间的松耦合设计而努力
设计模式有啥用
  1. 你要造一个破房子,造就完了,但你要造摩天大楼,那就需要为未来扩展,等因素做足够的设计方案
  2. 当一个项目开发完成,客户提出新功能怎么办?项目开发完,原来的程序员离职,你接手维护怎么办?
  3. 面试官问你Spring源码怎么办?这些都需要设计模式
  4. 设计模式用在软件的哪里呢?面向对象=》功能模块[设计模式+算法(数据结构)]=》框架[使用多种设计模式]=》架构[服务器集群]
设计模式的目的
  1. 设计模式让程序(软件)具有更好的
  1. 代码重用性(相同功能的代码,不用多次编写)
  2. 可读性(编程规范性,便于其他程序员阅读和理解)
  3. 可扩展性(当需要增加新的功能时,非常方便,称为可维护)
  4. 可靠性(当我们增加新功能后,对原来功能没有影响)
  5. 让程序呈现高内聚,低耦合的特性
  1. 设计模式包含了面向对象的精髓,懂了设计模式,就懂了面向对象分析和设计(OOA/D)的精要
一些书本中,将设计模式分为三种类型,共23种(不同的书籍,分类和名称略有差别)
  1. 创建型模式: 单例、抽象工厂、原型、建造者、工厂模式
  2. 结构型模式:适配器、桥接、装饰、组合、外观、享元、代理模式
  3. 行为型模式:模板方法、命令、访问者、迭代器、观察者、中介者、备忘录、解释器(Interpreter)、状态、策略、职责链(责任链)模式

一、设计模式7大原则

这里面提到的合成、聚合等概念,会在UML类图中讲解

1. 单一职责原则(Single responsibility principle)

  1. 对类来说,一个类应该只负责一项职责,如果A类负责两个不同职责,当其中一个职责需求变更,改变A类,可能造成职责2执行错误,所以需要将A类的粒度分解为A1、A2
遵守
  1. 降低类的复杂度,一个类只负责一项职责
  2. 提高类的可读性,可维护性
  3. 降低变更引起的风险
  4. 通常,只有逻辑足够简单,才可以在代码级,违反单一职责原则。(就是逻辑简单到完全没必要分模块,那可以写到一个类)
  5. 只有类中方法足够少,才能在方法级别,保持单一职责原则。(就是都写在一个类中,但是每个方法要保证单一原则,这种写法,必须保证类中方法非常少)

2. 接口隔离原则(Interface Segregation Principle)

  1. 客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上
  2. 下图中,A类和C类,需要实现某种功能,这些功能定义在interface1中A类需要B类来帮助实现功能,C类需要D类帮助,但是A类和C类只需要interface1接口中的部分方法。那么这个接口就不是A类和C类的最小接口。而他们需要来帮他们干活的B类和D类,需要额外实现他们不需要的方法
    在这里插入图片描述
  3. 根据接口隔离原则,我们应该将interface1接口拆分成独立的几个接口A和C类分别与需要的接口建立依赖,B和D类也只实现需要的方法
    在这里插入图片描述

3. 依赖倒转原则(Dependence Inversion Principle)

  1. 高层模块不应该依赖低层模块,二者都应该依赖其抽象
  2. 抽象不应该依赖细节,细节应该依赖抽象
  3. 依赖倒转(倒置)的中心思想是面向接口编程
  4. 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在java中,抽象指的是接口或抽象类细节就是具体的实现类
  5. 使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成
  1. 底层模块尽量都有抽象类或接口,程序稳定性会更好
  2. 变量的声明类型尽量是抽象类或接口,这样我们的变量引用和实际对象间,存在缓冲层,利用程序扩展和优化
  3. 继承时遵循里氏替换原则

4. 里氏替换原则(Liskov Substitution Principle)

  1. 继承有这样一层含义如下:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有子类必须遵守契约,但是如果子类对这些已经实现的方法任意修改,会对整个继承体系造成破坏
  2. 继承在给程序设计带来便利的同时,也带来了弊端。比如使用继承会给程序带来侵入性,程序的可移植性降低,增加对象间的耦合性,如果一个类被其他类所继承,则当这个类需要修改时,必须考虑所有子类父类修改后所有涉及到的子类的功能都有可能产生故障
  3. 如果正确使用继承呢?就是使用里氏替换原则
  1. 里氏替换原则,在1988年,由麻省理工学院的一位姓里的女士提出
  2. 如果对每个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生任何变化,那么类型T2是类型T1的子类型。(所有引用基类的地方必须能透明地使用其子类的对象
  3. 使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类方法
  4. 里氏替换原则告诉我们,继承实际上让两个类耦合性增强了,适当情况下,可以通过聚合,组合,依赖来解决问题(比如A继承B,B需要重写A类的很多方法,耦合性太高了。我们可以在A类上面提出一个抽象C(接口或抽象类,甚至普通的类),将这些方法定义到C中。让A和B都继承C,这样就解耦合了。如果A类需要B类,那么通过依赖传递即可)。

5. 开闭原则(opc: Open Closed Principle)

  1. 开闭原则是编程中最基础、最重要的设计原则
  2. 一个软件实体例如,类、模块和函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节。(就是你写的功能类,你可以随意增加功能修改,但是使用你这个类的人,不需要根据你的修改而改,这就是开闭原则
  3. 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
  4. 编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则

6. 迪米特原则(Demeter Principle)

  1. 一个对象应该对其他对象保持最少的了解
  2. 类与类关系越密切,耦合度越大
  1. 迪米特原则:又名最少知道原则,既一个类对自己依赖的类知道的越少越好。就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的public方法不对外泄漏任何信息
  2. 简单的定义:只与直接的朋友通信
  3. 直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,那么称他们之间为朋友关系。耦合方式很多,依赖,关联,组合,聚合等等。其中,我们称出现在成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接朋友。就是说,陌生的类最好不要以局部变量的形式出现在类的内部
  4. 怎么做呢,如果你需要在局部变量中声明一个类A来实现功能,请将这些功能,放到类A里面实现,然后调用它。(就是不要把自己的功能,写到别人那里面,A类的功能就写到A类里面)

7. 合成复用原则(Composite Reuse Principle)

  1. 尽量使用合成/聚合的方式,而不是使用继承
    在这里插入图片描述

二、创建型设计模式

1. 单例设计模式(Singleton Pattern)

由于篇幅原因,我将其放在这篇文章中:https://blog.csdn.net/grd_java/article/details/122304805

2. 工厂设计模式(Factory Pattern)

由于篇幅原因,我将其放在这篇文章中:https://blog.csdn.net/grd_java/article/details/122319280

3. 原形模式(Prototype Pattern)

由于篇幅原因,我将其放在这篇文章中:https://blog.csdn.net/grd_java/article/details/122327937

4. 建造者模式(Builder Pattern)

由于篇幅原因,我将其放在这篇文章中:https://blog.csdn.net/grd_java/article/details/122337277

三、结构型设计模式

1. 适配器模式(Adapter Pattern)

由于篇幅原因,我将其放在这篇文章中:https://blog.csdn.net/grd_java/article/details/122347273

2. 桥接模式(Bridge Pattern)

由于篇幅原因,我将其放在这篇文章中:https://blog.csdn.net/grd_java/article/details/122352344

3. 装饰者模式

4. 组合模式

5. 外观模式

6. 享元模式

7. 代理模式

三、行为型模式

1. 模板模式

2. 命令模式

3. 访问者模式

4. 迭代器模式

5. 观察者模式

6. 中介者模式

7. 备忘录模式

8. 解释器模式

9. 状态模式

10. 策略模式

11. 职责链模式

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殷丿grd_志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值