设计模式——七大原则

  • 汇总篇
  • 1、单一职责
  • 2、接口隔离
  • 3、依赖倒转
  • 4、里氏代换原则
  • 5、开闭原则
  • 6、迪米特法则
  • 7、合成复用

汇总篇

1、单一职责

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

违背原则示例:

public static void run(Integer type,String vehicle) {if (type == 1){System.out.println(vehicle + "在公路上运行");}else if (type == 2){System.out.println(vehicle + "在天空飞");}else {System.out.println(vehicle + "在水里游");}
}

符合原则代码:
1、这种方法没有对原来的类做大的修改,只是增加方法。
2、这里虽然没有在类这个级别上遵守单一职责原则,但是在方法级别上,仍然是遵守单一职责。

public class Only {public static void run(String vehicle) {System.out.println(vehicle + "在公路上运行");}public static void runAir(String vehicle) {System.out.println(vehicle + "在天空飞");}public static void runWater(String vehicle) {System.out.println(vehicle + "在水里游");}
}

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

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

2、接口隔离

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


就是将一个类拥有很多接口拆成多个类较少接口,实现接口隔离,不需要引入不需要的接口。


违背原则示例:

public interface interface0{void operation1(); // 产品void operation2(); // 程序员1号void operation3(); // 程序员2号void operation4(); // 测试void operation5(); // 运维}
// 实现类
static class work implements interface0{@Overridepublic void operation1() {}@Overridepublic void operation2() {}@Overridepublic void operation3() {}@Overridepublic void operation4() {}@Overridepublic void operation5() {}}

符合原则代码:

public class Segregation {/*** ---------------------------------拆开多个接口---------------------------------------------*/public interface interface1{ // 产品接口void operation1(); }public interface interface2{ // 程序员void operation2();void operation3();}public interface interface3{ // 测试void operation4();}/*** ---------------------------------类实现接口---------------------------------------------*/static class B implements interface2{@Overridepublic void operation2() {System.out.println("B实现接口2的方法");}@Overridepublic void operation3() {System.out.println("B实现接口2的方法");}}
}static class B implements interface3{@Overridepublic void operation4() {System.out.println("B实现接口3的方法");}
}

使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。


3、依赖倒转

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

违背原则代码

 public static void main(String[] args) {Person person = new Person();Email email = new Email();person.IReceiver(email); }public static class Person{ // 接收人public void IReceiver(Email email){System.out.println(email.info());}}public static class Email{String info(){return "邮件信息";}}

此时又想接收微信消息,还要再重新修改

符合原则代码:

 public static void main(String[] args) {IReceiver iReceiver = new Email(); // 接收邮件消息System.out.println(iReceiver.getInfo());// 要想再接收微信IReceiver iReceiver1 = new Weixin();System.out.println(iReceiver1.getInfo());}// 定义接口interface IReceiver{public String getInfo();}/*** ---------------------------------以下用实现类来做具体的细节操作---------------------------------------------*/static class Email implements IReceiver{@Overridepublic String getInfo() {// 这里实现细节return "邮件消息";}}static class Weixin implements IReceiver{@Overridepublic String getInfo() {// 这里实现细节return "微信消息";}}

依赖倒转原则的注意事项和细节:
1、低层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性更好。
2、变量的声明类型尽量是抽象类或接口,这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化
3、继承是遵守里氏代换原则。


4、里氏代换原则

一、OO中的继承性的思考和说明

  • 1、继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契
    约,虽然它不强制要求所有的子类必须遵循这些契约,但是如果子类对这些已经实
    现的方法任意修改,就会对整个继承体系造成破坏。

  • 2、继承在给程序设计带来便利的同时,也带来了弊端。比如使用继承会给程序带来侵
    入性,程序的可移植性降低,增加对象间的耦合性,如果一个类被其他的类所继承,
    则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到子
    类的功能都有可能产生故障

要使用好继承,就要了解里氏代换原则

二、基本了解

  • 1、在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法
  • 2、里氏替换原则告诉我们,继承实际上让两个类耦合性增强了,在适当的情况下,可
    通过聚合,组合,依赖 来解决问题
  • 3、如果对每个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序
    P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1
    的子类型。换句话说,所有引用基类的地方必须能透明地使用其子类的对象。
    .

就是当B类最好不要直接继承A类,去重写它,要再建一个更基础的类,两个都去继承,增强两个类的耦合性

违背原则代码

 class A{// 返回两个数的差public int func1(int num1,int num2){return num1 - num2;}}class B extends A{// 返回两个数的和public int func2(int num1,int num2){return num1 + num2;}@Overridepublic int func1(int num1, int num2) {return super.func1(num1, num2);}}

符合原则代码:

public class Lsdh {// 创建一个更加基础的类class Base{// 把更基础的方法和成员写到Base类}class A extends Base{// 返回两个数的差public int func1(int num1,int num2){return num1 - num2;}}class B extends Base{// 返回两个数的和public int func2(int num1,int num2){return num1 + num2;}// 如果B需要使用A类的方法,使用组合关系private A a  = new A();public int func3(int num1,int num2){return a.func1(num1,num2);}}
}

5、开闭原则

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

违背原则代码

 public static void main(String[] args) {// 画图功能GraphicEditor graphicEditor = new GraphicEditor();// 画一个正方形graphicEditor.draw(1,"正方形");}static class GraphicEditor{public void draw(Integer type,String draw) {if (type == 1){// 画正方形}else if (type == 2){// 画长方形}}}

如果要新增功能时,会修改到旧代码,要是旧代码是别人写的,可能会牵一发而动全身,出了好几个bug

符合原则代码

public class Ocp {public  void main() {// 画图功能GraphicEditor graphicEditor = new GraphicEditor();// 画一个正方形graphicEditor.drawShape(new square()); // 如果还要再画一个长方形,不需要改代码,直接扩展graphicEditor.drawShape(new rectangle());}// 要调用画图方法的类static class GraphicEditor{public void drawShape(draw draw) {draw.drawFunc();}}// 定义一个画图接口interface draw{// 画画的方法void drawFunc();}// 实现画图接口,作画class  square implements draw{@Overridepublic void drawFunc() {System.out.println("画了个正方形!");}}// 实现画图接口,作画class rectangle implements draw{@Overridepublic void drawFunc() {System.out.println("画了个长方形!");}}
}

这个原则讲的就是,将代码写的扩展性高点,如果新增功能,不用去改旧代码,直接新增新的功能


6、迪米特法则

一、基本介绍

  • 1、迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的
    越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内
    部。对外除了提供的public 方法,不对外泄露任何信息

  • 2、一个对象应该对其他对象保持最少的了解

违法原则代码

     // 咖啡类static class coffee{//泡咖啡public void make(){// 1、烧水// 2、磨咖啡粉// 3、泡}// 找秘书过来public String secretary(){return "过来";}}public static void main(String[] args) {coffee coffee = new coffee();coffee.make();coffee.secretary();}

符合原则代码:

    // 咖啡类static class coffee{//泡咖啡public void make(){// 1、烧水// 2、磨咖啡粉// 3、泡}// 找秘书,秘书泡好端过来public String secretaryMake(){make();return "coffee";}}public static void main(String[] args) {// 老板想找助理干活,还想喝coffee,直接叫助理泡好过来coffee coffee = new coffee();coffee.secretaryMake();}

三、注意事项

  • 迪米特法则的核心是降低类之间的耦合
  • 但是要注意:由于每个类都减少了不必要的依赖,因此迪米特法则只是要求降低类间(对象间)耦合关系,并不是要求完全没有依赖关系。

7、合成复用

一、基本介绍

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


违背原则代码

 static class A {public void method1(){System.out.println("你调用了方法一");}public void method2(){System.out.println("你调用了方法二");}}// B类继承Astatic class B extends A{}public static void main(String[] args) {B b = new B();b.method1();b.method2();}

使用继承方式,B类继承了A类之后,就可以使用了A类中的两个方法,这样耦合性较高,不推荐

符合原则代码

/*** ---------------------------------组合方式---------------------------------------------*/static class B{A a = new A();public void method1(){a.method1();}public void method2(){a.method2();}}public static void main(String[] args) {B b = new B();b.method2();b.method1();}
/*** ---------------------------------依赖方式---------------------------------------------*/static class B{public void method1(A a){a.method1();}public void method2(A a){a.method2();}}

组合/聚合的方式,在B类里注入A,通过注入的A类来调用方法,耦合性低,易扩展。符合合成复用的原则
依赖方式,把A类作为参数传递到B类的两个方法中,从而达到调用A类的方法,耦合性低。符合合成复用的原则

核心思想

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. JAVA设计模式七大原则

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

最新文章

  1. 需要更换手机了:由 TensorFlow Lite 构建无人驾驶微型汽车
  2. USACO 1.3... 虫洞 解题报告(搜索+强大剪枝+模拟)
  3. 【VS+QT开发】获取本地网络信息小软件(C++)
  4. 思考:固态硬盘的普及,是否影响到了存储引擎的设计?
  5. 【转】正则基础之——捕获组(capture group)
  6. 角谷定理python输出变化过程,Python 100例——第十章----定理与猜想
  7. C++实例讲解Binder通信
  8. java foreach多线程_详解多线程入门案例与java8的并行流
  9. 【论文阅读】Computational Personality: A Survey 计算性格学综述
  10. 【视频】CCNA——小凡模拟器的简单介绍和使用
  11. java 路径规划_应用内路径规划的简单实现
  12. nacos指定外网ip
  13. 基于 IPO 经济理论模型对目前 ICO 的理论研究和分析
  14. html添加B站视频,iframe嵌入BiliBili视频方法B站视频外链
  15. 大学计算机课程实验指导书,《大学计算机基础》课程实验指导书.doc
  16. html地图周边搜索,高德地图API实现定位、地点搜索和周边搜索(H5/Vue/微信小程序)...
  17. 4.文本分类——textRNN模型
  18. 裴蜀定理(详细定义+应用+模板)
  19. 基于OCR识别引擎的识别表格文字并将结果以Excel电子表格的形式原样导出的Android客户端代码
  20. 算法(一) 算法初步

热门文章

  1. 上穿均线压力的大阳线特征:
  2. formality: 形式验证流程
  3. 大鱼吃小鱼算法java,瞬间高大上了!
  4. 【报名】榜单奖项+产业图谱+行业报告+线下论坛,2021年终金猿策划活动已开启...
  5. 华为鸿蒙系统能玩安卓游戏吗_华为正式发布鸿蒙系统 鸿蒙和安卓游戏数据是否互通...
  6. Microsoft Edge安装扩展插件
  7. i7 13700k核显性能 酷睿i713700k参数 i7 13700k功耗
  8. Android 通知屏幕亮起
  9. 离婚后发现对方婚内出轨,还能否要赔偿
  10. 哈拉德·柯施纳的狡猾