2021-06-07

Java设计模式(1:软件架构设计七大原则及开闭原则详解)

在日常工作中,我们使用Java语言进行业务开发的时候,或多或少的都会涉及到设计模式,而运用好设计模式对于我而言,又是一个比较大的难题。为了解决、克服这个难题,笔主特别开了这个博客来记录自己学习的笔记和自己的理解,也欢迎对此有兴趣的朋友一起来和笔主探讨,共同学习。

前言

在日常工作中,我们使用Java语言进行业务开发的时候,或多或少的都会涉及到设计模式,而运用好设计模式对于我而言,又是一个比较大的难题。为了解决、克服这个难题,笔主特别开了这个博客来记录自己学习的笔记和自己的理解,也欢迎对此有兴趣的朋友一起来和笔主探讨,共同学习。

一、软件架构设计模式的七大原则

1、开闭原则

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

2、单一职责原则

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

3、依赖倒置原则

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

4、接口隔离原则

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

5、迪米特法则

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

6、里氏替换原则

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

7、合成复用原则

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

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

二、开闭原则详解

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

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

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

/** * 商品基本信息 接口 */public interface Goods { /**  * 商品的价格  */ void getPrice(); /**  * 商品的名称  */ void getName();}

我们发现超市里有薯片贩卖,我们再来写一个薯片的类来实现这个接口,同时标明薯片的名称和价格:

/** * 乐事薯片 */public class Crisps implements Goods{ @Override public void getPrice() {  System.out.println("商品的价格:9.9 RMB"); } @Override public void getName() {  System.out.println("商品的名称:乐事薯片"); }}

老板说以后还会有面包出售,那我们再来创建一个类来表明面包的基本信息:

/** * 面包 */public class Bread implements Goods{ @Override public void getPrice() {  System.out.println("商品的价格:5.5 RMB"); } @Override public 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种设计模式。这是我学习记录的一个过程,谢谢!









原文转载:http://www.shaoqun.com/a/787333.html

跨境电商:https://www.ikjzd.com/

深诺互动:https://www.ikjzd.com/w/2746

cares:https://www.ikjzd.com/w/1302

lithium:https://www.ikjzd.com/w/2505

photobucket:https://www.ikjzd.com/w/132


在日常工作中,我们使用Java语言进行业务开发的时候,或多或少的都会涉及到设计模式,而运用好设计模式对于我而言,又是一个比较大的难题。为了解决、克服这个难题,笔主特别开了这个博客来记录自己学习的笔记和自己的理解,也欢迎对此有兴趣的朋友一起来和笔主探讨,共同学习。前言在日常工作中,我们使用Java语言进行业务开发的时候,或多或少的都会涉及到设计模式,而运用好设计模式对于我而言,又是一个比较大的难题。
EFN欧洲配送网络:https://www.ikjzd.com/w/390
Amachete:https://www.ikjzd.com/w/550
亚马逊反链backlink:https://www.ikjzd.com/w/902
易仓erp:https://www.ikjzd.com/w/1420
华强G90:https://www.ikjzd.com/w/1527
淼深物流:https://www.ikjzd.com/w/1866
宝贝格子:https://www.ikjzd.com/w/1322
口述:小姨子与姐夫之间那些不要脸的事儿(中)(5/5):http://lady.shaoqun.com/m/a/82893.html
老公想和初恋做普通朋友 该同意吗:http://lady.shaoqun.com/m/a/271670.html
老公爱上赌博忽略了我 口述第一次和网友见面的故事:http://lady.shaoqun.com/m/a/270098.html
丈夫出轨和女下属一夜未归:http://lady.shaoqun.com/a/271841.html
受不了了,别舔,要尿了 老公狠心将我送上别人的床:http://lady.shaoqun.com/a/274353.html
亲哥哥当街给我女友戴文胸:http://www.30bags.com/a/251740.html
雨夜与情人拥吻被同事撞见:http://www.30bags.com/m/a/249269.html
口述:在办公室和同事疯狂的一次性爱经历:http://www.30bags.com/m/a/254618.html
我主动提出上床 老公嫌我恶心:http://www.30bags.com/m/a/252536.html
男女内心私言:http://www.30bags.com/a/372260.html

No comments:

Post a Comment