设计模式是为了让程序,具有更好的

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

七大原则:

单一职责原则

对类来说,即一个类应该只负责一项职责。如类A负责两个不同职责:职责1、职责2。当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1、A2.

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

接口隔离原则

因此上述例子应将Interface1拆分为3个独立的接口

依赖倒转原则

  • 高层模块不应该依赖底层模块,二者都应该依赖其抽象
  • 抽象不要应该依赖细节,细节应该依赖抽象
  • 依赖倒转的中心思想使面向接口编程
  • 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在java中,抽象指的是接口或抽象类,细节就是具体的实现类。
  • 使用接口或者抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。

我们看下边的代码

 Person类直接接收的是Email这个对象,此时是仅仅要接收来自电子邮件的信息,但当我们需要接收来自其他地方的信息,比如WeChat类和Phone类,Person还要去实现两个不同的方法,分别用来接收WeChat类和Phone类吗

解决方案

引入一个抽象的接口IReceiver, 表示接收者, 这样Person类与接口IReceiver发生依赖 因为Email, WeChat等等属于接收的范围,他们各自实现IReceiver 接口就ok, 这样我们就符合依赖倒转原则,细节依赖抽象。

里氏替换原则

oo中继承性的思考和说明

  1. 继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然他不强制要求所有的子类必须遵循这些契约,但是如果子类对这些已经实现的方法任意修改,就会对整个继承体系造成破坏
  2. 继承在给程序设计带来遍历的同时,也带来了弊端。比如使用继承会给程序带来侵入性,程序的可移植性降低,增加对象间的耦合性,如果一个类被其他的类所继承,则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到子类的功能都有可能产生故障
  3. 问题提出:在编程中,如何正确的使用继承  ==>  里氏替换原则

基本介绍

  1. 里氏替换原则(Liskov Substitution Principle)在1988年,由麻省理工学院的以为姓里 的女士提出的。
  2. 如果对每个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序 P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1 的子类型。换句话说,所有引用基类的地方必须能透明地使用其子类的对象。
  3. 在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法
  4. 里氏替换原则告诉我们,继承实际上让两个类耦合性增强了,在适当的情况下,可以通过聚合,组合,依赖来解决问题(即在一个对象中引入另一个对象的实例)。
  5. 子类可以扩展父类的功能,但不能改变父类原有的功能。

根据上述理解,对里氏替换原则的定义可以总结如下:

  • 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法
  • 子类中可以增加自己特有的方法
  • 当子类的方法重载父类的方法时,方法的前置条件(即方法的输入参数)要比父类的方法更宽松
  • 当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的的输出/返回值)要比父类的方法更严格或相等

开闭原则

  1. 开闭原则是编程中最基础、最重要的设计原则
  2. 一个软件实体如类,模块和函数应该对拓展开放(对提供方),对修改关闭(对使用方)。用抽象构建框架,用实现拓展细节。
  3. 当软件需要变化时,尽量通过拓展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化 ---> 拓展而不是修改。
  4. 编程中遵循其他原则,以及使用设计模式的目的就是遵循开闭原则。

当纸杯只有一个功能,装水时。有一个纸杯操作接口,有一个纸杯操作实现类。

当我们要添加一个功能 种花苗时,我们不也是加一个方法吗?如下:

当添加N个方法时,不也是在纸杯的操作接口上面添加N个方法吗?

我们想一想,此时已经背离了我们的开闭原则。因为每添加一个方法,都要在操作类上面做修改。所以,我们按照开闭原则,做了以下合理的设计:

从上面可以看出,我们把纸杯的操作类,统一写成一个接口,每个不同的操作继承此接口来完成各自操作。

迪米特法则

  • 一个对象应该对其他对象保持最少的了解
  • 类与类的关系越密切,耦合度越大
  • 又名为最少知道原则,即一个类对自己以来的类知道的越少越好。也就是说,对于除了提供的public方法,不对外泄露任何信息
  • 迪米特法则还有一个简单的定义:只与直接的朋友通信
  • 直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式有很多,依赖、关联、组合、聚合等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类中

每个类之间都减少不了必要的依赖,只是降低,不是要求完全没有。

合成复用原则

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

A类想要使用B类的方法,是在A中声明B对象,而不是去作为B的子类。

设计模式---七大原则相关推荐

  1. Java面试之设计模式七大原则

    最近项目不太忙,不怎么加班,正利用晚上时间好好学习学习设计模式,之前可能多多少少都用到过,但是有些还是很模糊,这下正好系统的学一下. 好了,话不多说,进入正题. 1.什么是设计模式? 软件工程中,设计 ...

  2. 第 2 章 设计模式七大原则

    第 2 章 设计模式七大原则 1.设计模式的目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的挑战, 设计模式是为了让程序(软件),具有如下更好的 ...

  3. 设计模式——七大原则(附代码示例)

    一. 设计模式概念         对接口编程而不是对实现编程:优先使用对象组合而不是继承 二. 设计模式总览 1. 创建型模式(Creational Patterns):(5) 单例(Singlet ...

  4. 设计模式——七大原则

    设计模式--七大原则 汇总篇 1.单一职责 2.接口隔离 3.依赖倒转 4.里氏代换原则 5.开闭原则 6.迪米特法则 7.合成复用 汇总篇 1.单一职责 对类来说的,即一个类应该只负责一项职责.如类 ...

  5. 图解设计模式-设计模式七大原则

    Java设计模式 设计模式七大原则 设计模式的目的 编写软件过程中,程序员面临来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让 **程序(软件)**具有更好的 ...

  6. Day305.设计模式七大原则 -Java设计模式

    七大设计原则 一.设计模式的目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的挑战,设计模式是为了让程序(软件),具有更好的↓↓↓ 1. 代码重用 ...

  7. Java设计模式七大原则-单一职责原则

    目录 概述:设计模式的目的 设计模式七大原则 单一职责原则 单一职责原则注意事项和细节 概述:设计模式的目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等 ...

  8. 设计模式七大原则介绍

    文章目录 1. 设计模式有哪些种类 2. 设计模式的目的 3. 设计模式七大原则 3.1. 单一职责原则 1. 基本介绍 2. 模拟场景 2. 接口隔离原则 1. 基本介绍 2. 模拟场景 3. 依赖 ...

  9. 设计模式七大原则知识概括

    设计模式七大原则知识概括 设计模式的目的 设计模式七大原则 单一职责原则 接口隔离原则 依赖倒转(倒置)原则 里氏替换原则 开闭原则 迪米特法则 合成复用原则 设计原则核心思想 设计模式的目的 目的: ...

  10. JAVA设计模式七大原则

    设计模式七大原则 设计模式目的 1.代码重用性 2.可读性 3.可读性 4.扩展性 5.可靠性 6.高内聚低耦合 七大原则 1.单一职责原则 一个类或方法中只做一件事情 2.接口隔离原则 一个类通过接 ...

最新文章

  1. awk处理文件内容格式
  2. 面试官:你说你精通Redis,你看过持久化的配置吗?
  3. Visual C++ 控制栏
  4. java restful项目打包_听说你在接私活? 一个助你效率翻倍的项目工具!!
  5. 多进程 VS 多线程
  6. sql having是什么意思_图解sql面试题:如何查找重复数据?
  7. js中解析json字符串
  8. vue怎么vw布局好用_vue cli3项目的pc自适应布局_vw
  9. MySQL 索引失效的 15 种场景!
  10. Struts2增删改查 myeclipse开发文档加项目源码及eclipse开发项目源码
  11. Docker资源限制
  12. 1067. Sort with Swap(0,*)
  13. linux 大量文件 ls卡死,Linux下文件过多导致 ls 命令出现 arguments too long 的问题
  14. 可以自由停靠的窗体!
  15. 8种常被忽视的SQL错误用法
  16. spring batch(批处理)
  17. 【UVA1599】Ideal Path理想路径--两种约束条件(!!双向bfs+非简单图的最短路+无向图邻接记录法)
  18. vue构建项目对接口的调用封装
  19. 网页的基本信息及组成HTML文件的基本结构
  20. import java.io后报错_用JSP+JAVABEAN实现一个根据圆半径求圆面积、圆周长的功能:为什么我的老出错啊错误:...

热门文章

  1. Map的几种循环方法
  2. 从中级到架构透彻讲解PHP面试必考题【2021版】
  3. CreateFile 总是调用错误的解决办法
  4. VS Code ---- 使用笔记
  5. Git:查看本地分支基于哪个分支创建
  6. idea的快捷键及修改快捷键
  7. idea修改快捷键,跳转实现类快捷键
  8. [啄木鸟]第20次CPUG会课
  9. Fedora 25 相关配置
  10. git 常用操作流程实现