前言
在日常工作中,我们使用Java语言进行业务开发的时候,或多或少的都会涉及到设计模式,而运用好设计模式对于我而言,又是一个比较大的难题。为了解决、克服这个难题,Remi酱特别开了这个博客来记录自己学习的笔记和自己的理解,也欢迎对此有兴趣的朋友一起来和博主探讨,共同学习。
一、软件架构设计模式的七大原则
1、开闭原则
对扩展开放,对修改关闭。在程序需要扩展的时候,不能去修改原有的代码实现一个热插拔的效果。简而言之,就是用抽象构建架构,用实现扩展细节。

2、单一职责原则
不要存在多于一个导致类变更的原因。简单来说,就是 一个Class/Interface/Method只负责一项职责 。

3、依赖倒置原则
这个原则是开闭原则的基础,是指设计结构代码时,高层模块不应该依赖于底层模块,二者应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。即: 针对接口编程,依赖于抽象而不依赖于具体 。

4、接口隔离原则
使用多个接口,而不使用单一的接口,客户端不应该依赖它不需要的接口。尽量的 细化接口的职责,降低类的耦合度 。

5、迪米特法则
又被成为 最少知道原则 ,指的是一个对象应该对其他对象保持最少的了解。一个实体类应当尽量少地和其他实体之间发生相互作用,使得系统模块相互独立。形象来说就是:只和朋友交流,不和陌生人说话。

6、里氏替换原则
如果说实现开闭原则的关键步骤就是抽象化,那么基类(父类)和子类的继承关系就是抽象化的具体实现,所以里氏替换原则就是对实现抽象化的具体步骤的规范。即:子类可以扩展基类(父类)的功能,但不能改变父类原有的功能。

7、合成复用原则
尽量使用对象组合/聚合,而不是使用继承达到软件复用的目的。可以使系统更加的灵活,降低类与类之间的耦合度,一个类的变化对于其他类来说影响相对较少。

继承我们称之为白箱复用,相当于把实现的细节暴露给子类,组合/聚合 也成为黑箱复用,对类之外的对象是无法获取到实现细节的。

二、开闭原则详解
对扩展开放,对修改关闭。在程序需要扩展的时候,不能去修改原有的代码实现一个热插拔的效果。简而言之,就是用抽象构建架构,用实现扩展细节。

光看理论是不行的,这样的话我们只能是有一个模糊的认识,对具体的细节不太能看得清,我们先来举一个例子看一看它是怎么使用的:

例:假如我们居住的附近有一个小超市开业了,里面有各种的商品。老板想找你帮忙做一个超市商品的管理系统,那么针对超市众多商品的情况,我们首先应该会想到创建一个类来显示商品的基本信息:价格、名称等, 针对此,我们先来创建一个接口:

/*** 商品基本信息 接口*/
public interface Goods {/*** 商品的价格*/void getPrice();/*** 商品的名称*/void getName();
}
我们发现超市里有薯片贩卖,我们再来写一个薯片的类来实现这个接口,同时标明薯片的名称和价格:/*** 乐事薯片*/
public class Crisps implements Goods{@Overridepublic void getPrice() {System.out.println("商品的价格:9.9 RMB");}@Overridepublic void getName() {System.out.println("商品的名称:乐事薯片");}
}
老板说以后还会有面包出售,那我们再来创建一个类来表明面包的基本信息:/*** 面包*/
public class Bread implements Goods{@Overridepublic void getPrice() {System.out.println("商品的价格:5.5 RMB");}@Overridepublic void getName() {System.out.println("商品的名称:面包");}
}

等把这一切做好后,老板说因为新店刚刚开业,没有什么人气,就想前期通过薯片打折的方式来吸引人气(薯片打六折),这个时候我们想到的是:

1、修改 Crisps 类中的 getPrice() 方法,但这会有一定的风险,可能会影响其他地方的调用结果。那么这个方法就可以pass掉。

2、在 Goods 接口中再加一个方法获取打折后的价格,但最后发现 Bread 类也需要去实现这个方法,但是面包并没有打折,这就对接口其他的实现类造成了影响,显然不可取。

3、在 Crisps 类中再加入一个方法来获得打折后的薯片价格,但这样可能会改变 Crisps 类的结构,可能会造成不必要的麻烦,而且开闭原则的基础就是:扩展程序的时候不能去修改原有的代码。那么这个方法也被pass。

4、在增加一个类去继承 Crisps 类,在子类中增加一个方法获取打折后的价格,这样通过子类我们可以获取到商品的名称,打折前的价格,打折后的价格,也不会改变 Crisps 类原有的结构,符合我们的规范,那我们再来编写一个类。

/*** 薯片的子类*/
public class CrispsDisCountPrice extends Crisps {/*** 打折后的价格*/public void getDisCountPrice(){System.out.println("打折后的价格:"+ 9.9*0.6 +" RMB");}
}

我们来看一下类的结构图:

Crisps 类和 Bread 类是接口 Goods 的实现类,而 CrispsDisCountPrice 类继承了 Crisps 类。

写个测试类测试一下:

public class Test {public static void main(String[] args) {Bread bread = new Bread();CrispsDisCountPrice crisps = new CrispsDisCountPrice();bread.getName();bread.getPrice();crisps.getName();crisps.getPrice();crisps.getDisCountPrice();}
}

结果:

最后
学习设计模式不能只理解于理论,要根据例子理解才能更加的清晰、透彻。接下来的几篇博客,我会将设计模式剩下的六个原则都一一说明,并举一例子。讲完七大原则后,会重点解析我们常说的23种设计模式。这是我学习记录的一个过程,谢谢!

文章来源:https://www.tuicool.com/articles/7BVnqyq
作者:博客园

设计模式-软件架构设计七大原则及开闭原则详解相关推荐

  1. 七大设计原则之开闭原则

    一.开闭原则介绍 开闭原则(Open Closed Principle)是编程中最基础,也是最重要的设计原则.编程中遵循其他原则以及使用设计模式的目的就是遵循开闭原则. 一个软件实体如类,模块和函数应 ...

  2. 设计模式-02.经典设计原则-第一节-单一职责原则,开闭原则,里式替换,接口隔离【万字长文系列】

    文章目录 设计模式经典设计原则-第一节 单一职责原则(SRP) 如何理解单一职责原则? 如何判断类的职责是否足够单一? 类的职责是否设计得越单一越好? 开闭原则(OCP) 如何理解"对扩展开 ...

  3. 设计模式六大原则之--开闭原则(OCP)

    设计模式六大原则之--开闭原则(OCP) 前言 1 描述 2 理解: 3 问题由来: 4 使用LoD的好处: 5 难点: 6 最佳实践: 7 范例: 前言 The Open - Closed Prin ...

  4. [设计原则] 六大设计原则之“开闭原则”

    [设计原则] 六大设计原则之"开闭原则" 目录 [设计原则] 六大设计原则之"开闭原则" 什么是开闭原则 为什么使用开闭原则 如何使用开闭原则 注意事项 总结 ...

  5. Java设计原则之单一职责原则、开闭原则、里氏代换原则

    文章目录 面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 面向对象设计原则概述 软件的可维护性(Maintainability)和可复用性(Reusability)是两个非常重要的用于衡量 ...

  6. 设计原则:开闭原则(OCP)

    1.什么是开闭原则 开闭原则的英文是Open Closed Principle,缩写就是OCP.其定义如下: 软件实体(模块.类.方法等)应该"对扩展开放.对修改关闭". 从定义上 ...

  7. Java面向对象设计原则1——开闭原则

    在我们学习面向对象编程的时候,总会出现一些问题,好比以前刚刚写好的代码,上线测试可以.正常运行,突然有一天说要加一个功能,改完之后,发现以前正常运行的功能不能用了,类似这样的问题有好多好多,为了避免类 ...

  8. 关于Java面向对象程序设计原则之一——开闭原则的思考与分享

    整理日期:2022-05-27 目录 一.开闭原则 二.为什么使用开闭原则 三.如何在程序设计中体现开闭原则 一.开闭原则 开闭原则(Open-Closed Principle, OCP)是指一个软件 ...

  9. 七大软件设计原则之一 | 开闭原则

    公众号「蝉沐风」,你们的赞和评论对我很重要,欢迎大家关注交流 开闭原则是指一个软件实体(模块.类.方法等)应该对扩展开放,对修改关闭 我举一个例子,陀螺是个程序喵,创办了一个生产猫粮的公司--跑码场, ...

最新文章

  1. python累加求和_李老师带你学Python-第二课 如何编写Python程序
  2. C++中的const成员函数介绍
  3. linux shell expect 处理 passwd 交互
  4. 表单绑定 v-model —— :value @input || v-model原理
  5. spark的三种运行模式以及yarn-client和yarn-cluster在提交命令上的区别
  6. Java开发趋势:2019年展望
  7. HDU 5691 Sitting in Line 状压dp
  8. 一加7pro保存的录音文件在哪一个文件夹?
  9. 企业如何降低应用安全风险?
  10. 计算机字长与下列哪项指标密切相关,组成原理与汇编语言-中国大学mooc-题库零氪...
  11. html5吻胸小游戏,html5气球大战小游戏代码
  12. 苹果手机清灰_手机听筒喇叭声音越来越小?来试试这三个小技巧
  13. C程序设计试题汇编(第三版)谭浩强主编 第二章 选择题解析+总结
  14. 计算机查看图片的打开方式,windows10电脑怎么在右键菜单打开方式添加照片查看器...
  15. 高通携手贵州华芯通:成功源于创新 大数据前景美妙
  16. 【总结】1396- 60+个 VSCode 插件,打造好用的编辑器
  17. 胆囊炎的临床症状有哪些?
  18. 三维电影特效动画制作软件——Houdini 17.5
  19. Persist Security Info = true | false作用
  20. 做一个python的旅游系统_Python爬取13个旅游城市,告诉你新年大家最爱去哪玩?...

热门文章

  1. ORA-12516 TNS: 监听程序找不到符合协议堆栈要求的可用处理程序
  2. 将ALV GRID中改变的值更新到ALV内表中
  3. 抖音用户规模达5.18亿,数据解读抖音支付背后逻辑?
  4. 疫情撬动游戏产业“底层认知”,正向价值愈发突显
  5. 阿里8亿加持B端智能化后,本地生活服务更好做了吗?
  6. 软件测试需要什么样的思维,你知道软件测试的核心价值是什么吗?为什么我们需要软件测试?...
  7. python3堆排序_python 堆排序
  8. qt android 对话框,Qt自定义Dialog
  9. 移动互联网时代的信息安全与防护_移动互联网时代,草根创业还有哪些机会?...
  10. mysql 一分钟内_MySQL语句需要超过一分钟才能执行