Java设计模式学习记录-GoF设计模式概述
前言
最近要开始学习设计模式了,以前是偶尔会看看设计模式的书或是在网上翻到了某种设计模式,就顺便看看,也没有仔细的学习过。前段时间看完了JVM的知识,然后就想着JVM那么费劲的东西都看完了,说明自己学习耐力还是有的,所以就打算仔细的研究研究设计模式,然后也将设计模式的学习过程记录下来。
GoF的设计模式
Gang of Four,简称GoF,分别是Erich Gamma, Richard Helm, Ralph Johnson和John Vlissides,这四位软件工程学者在1994年归纳发表了23种在软件开发中使用频率较高的设计模式,旨在用模式来统一沟通面向对象方法在分析、设计和实现间的鸿沟。软件开发发展到现在设计模式已经不至23种了,但是GoF的23种设计模式还是软件开发种很常用的,所以一般讲解设计模式都是指的GoF的23种设计模式,我以后要学习的设计模式也是这23种设计模式。并且举例子也都是以Java语言为主的。
面向对象设计原则
单一职责原则(Simple Responsibility Principle,SRP)
一个类应该只有一个功能领域的职责,对外只提供一种功能,而引起类变化的原因应该只有一个。单一原则要达到的目的就是高内聚,低耦合。例如有一个用户类,这个用户类中包含用户的属性和用户的行为,这就造成了业务对象和业务逻辑被放在了一起,使得这个类有两种职责,违背了单一职责原则。应该将属性和行为分开,分别设立单独的接口(属性接口,行为接口)和实现类(属性实现类,行为实现类),这样就可以将业务对象和业务逻辑单独分开了。
开闭原则(Open Close Principle,OPC)
一个对象对扩展开发,对修改关闭。通俗的理解是:对类的改动是通过增加代码进行的,而不是改动现有的代码。例如有一个用户行为接口,这个接口已经有两个实现类了,这时有一个需求是要给这个用户新增一个行为,这个时候需要更改用户行为接口,但是这样就违背了开闭原则。真正符号开闭原则的做法是,再写一个新的接口(或抽象类)继承自用户行为接口,然后所有的用户行为实现类都实现这个新的接口(或继承自新的抽象类)。
里氏替换原则(Liskov Substitution Principle,LSP)
在任何父类出现的地方都可以用它的子类来替代。也就是说同一个继承体系中的对象应该有共同的行为特征。在里氏替换原则中,所有引用基类的地方必须能够透明地使用其子类对象。只要有父类出现的地方,子类就能够出现,而且替换为子类不会产生任何错误或异常。反过来,子类出现的地方,替换为父类就可能出现问题了。
里氏替换原则为良好的继承定义了一个规范,具体有4个:
- 子类必须完成实现父类的方法。
- 子类可以有自己的特性。
- 覆盖或者实现父类的方法时输入参数可以被放大。
- 覆盖或者实现父类的方法时输出结果可以被缩小。
依赖注入原则(Dependence Inversion Principle,DIP)
编程时要依赖于抽象,不要依赖于具体的实现。在应用程序中,所有的类如果使用或依赖于其他的类,则都应该依赖于这些其他类的抽象类(或接口),而不是依赖于这些其他类的具体实现类。
依赖注入原则需要注意的是:高层次模块不应该依赖低层次模块,即使用接口或抽象类进行变量的声明、参数类型的声明、方法返回类型的声明、数据类型状态等,而不要用具体实现类来做这些。
依赖注入的实现方式有三种:
- 通过构造函数传递依赖对象。
- 通过setter方法传递依赖对象。
- 接口声明实现依赖对象。
接口分离原则(Interface Segregation Priciple,ISP)
不应该强迫客户程序依赖它们不需要使用的方法。意思就是说,一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该把所以的操作都封装到一个接口中。
在使用接口分离原则时需要注意几点:
- 接口尽量小:这主要是为了保证一个接口只服务于一个子模块或一类子模块。
- 接口高内聚:接口高内聚是对内高度依赖,对外尽可能隔离。即一个接口内部声明的方法相互之间都与某一个子模块相关,且使这个模块必需的。
- 接口设计是有限度的:如果完全遵循接口分离原则,接口粒度会越来越小,接口数量剧增,会导致系统复杂度大大增加,所以在设计接口时不应该一味的去分离接口。
迪米特原则(最少知识原则-LeastKonwledge Priciple,LKP)
一个软件实体应该尽可能少的与其他软件实体发生相互作用。就是说各个对象或各个类之间应该尽可能降低耦合,提高系统的可维护性。在模块之间应该通过接口来通信,而不理会模块的内部工作原理,它可以使各个模块耦合度降到最低,促进软件的复用。
设计模式类型
五个创建型设计模式
工厂方法模式(含简单工厂,Factory Method Pattern)
抽象工厂模式(Abstract Factory Pattern)
七个结构型设计模式
十一个行为模式
责任链模式(Chain of Responsibility Pattern)
模板方法模式(Template Method Pattern)
访问者模式(Visitor Pattern)
这些模式的学习文章写好后,会把链接赋到名称后面的。这一篇文章也算是作为我设计模式学习的开篇吧,本来想直接写简单工厂模式的,但是后来发现要学设计模式需先把设计模式的来源以及遵循的原则搞清楚,所以就有了这么一个开篇文章,以后添加上了链接也可以作为我学习设计模式的文章的目录。
Java设计模式学习记录-GoF设计模式概述的更多相关文章
- Java设计模式学习记录-模板方法模式
前言 模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 模板方法模式 概念介绍 模板方法模式,其实是很好理解的,具体 ...
- Java设计模式学习记录-状态模式
前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...
- Java设计模式学习记录-观察者模式
前言 观察者模式也是对象行为模式的一种,又叫做发表-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式. 咱们目前用的最多的就是各种MQ(Message Queue ...
- Java设计模式学习记录-备忘录模式
前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...
- Java设计模式学习记录-迭代器模式
前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/ ...
- Java设计模式学习记录-解释器模式
前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...
- Java设计模式学习记录-命令模式
前言 这次要介绍的是命令模式,这也是一种行为型模式.最近反正没有面试机会我就写博客呗,该投的简历都投了.然后就继续看书,其实看书也会给自己带来成就感,原来以前不明白的东西,书上已经给彻底的介绍清楚了, ...
- Java设计模式学习记录-享元模式
前言 享元模式也是一种结构型模式,这篇是介绍结构型模式的最后一篇了(因为代理模式很早之前就已经写过了).享元模式采用一个共享来避免大量拥有相同内容对象的开销.这种开销最常见.最直观的就是内存损耗. 享 ...
- Java设计模式学习记录-外观模式
前言 这次要介绍的是外观模式(也称为门面模式),外观模式也属于结构型模式,其实外观模式还是非常好理解的,简单的来讲就是将多个复杂的业务封装成一个方法,在调用此方法时可以不必关系具体执行了哪些业务,而只 ...
随机推荐
- playframework 一步一步来 之 日志 (二)
带着之前的疑问,我们先回顾一下日志相关的知识: 首先是SL4J,SL4J是个什么东西来着?官方解释为:“The Simple Logging Facade for Java (SLF4J) serve ...
- JNI 记
Java Native Interface(JNI)从零开始详细教程 ================================================================ ...
- PAT 1088 三人行 模拟,坑 C
PAT 1088 三人行 https://pintia.cn/problem-sets/994805260223102976/problems/1038429286185074688 题目: 子曰:“ ...
- Paper | Batch Normalization
目录 1. PROBLEM 1.1. Introduction 1.2. Analysis 2. SOLUTION 2.1. Batch Normalization 及其问题 2.2. 梯度修正及其问 ...
- CMD指令及其意义
1. appwiz.cpl:程序和功能 2. calc:启动计算器 5. chkdsk.exe:Chkdsk磁盘检查(管理员身份运行命令提示符) 6. cleanmgr: 打开磁盘清理工具 9. cm ...
- Scala数组小结
1.定长数组 定长数组:指长度不可变的数组Array. 第一种方式: 先声明一个数组,后初始化该数组: scala> val array = new Array[Double](5) array ...
- 三.mysql表的完整性约束
mysql表的完整性约束 什么是约束 not null 不能为空的 unique 唯一 = 不能重复 primary key 主键 = 不能为空 且 不能重复 foreign key ...
- 分享Azure DevOps技术,来微信群吧!
现在QQ用户越来越少,基本上都转移到微信上了. 讨论问题,动不动就来一个微信群.下面这样几百人的微信群,专门讨论Azure DevOps (TFS)技术,你加入了么? 还等什么,扫描吧!
- Jenkins高危代码执行漏洞检测/开源漏洞靶场
漏洞细节可以参看安全客的文章:https://bbs.ichunqiu.com/thread-22507-1-1.html Jenkins-CLI 反序列化代码执行(CVE-2017-1000353) ...
- 4.json解析
格式 {"name":"zhangsan", "age":18, "books":[{"name": ...