前言

最近要开始学习设计模式了,以前是偶尔会看看设计模式的书或是在网上翻到了某种设计模式,就顺便看看,也没有仔细的学习过。前段时间看完了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)

单利模式(Singleton Pattern)

原型模式(Prototype Pattern)

建造者模式(Builder Pattern)

七个结构型设计模式

适配器模式(Adapter Pattern)

桥接模式(Bridge Pattern)

组合模式(Composite Pattern)

装饰模式(Decorator Pattern)

外观模式(Facade Pattern)

享元模式(Flyweight Pattern)

代理模式(Proxy Pattern)

十一个行为模式

责任链模式(Chain of Responsibility Pattern)

命令模式(Command Pattern)

解释器模式(Interpreter Pattern)

迭代器模式(Iterator Pattern)

中介者模式(Mediator Pattern)

备忘录模式(Memento Pattern)

观察者模式(Observer Pattern)

状态模式(State Pattern)

策略模式(Strategy Pattern)

模板方法模式(Template Method Pattern)

访问者模式(Visitor Pattern)

这些模式的学习文章写好后,会把链接赋到名称后面的。这一篇文章也算是作为我设计模式学习的开篇吧,本来想直接写简单工厂模式的,但是后来发现要学设计模式需先把设计模式的来源以及遵循的原则搞清楚,所以就有了这么一个开篇文章,以后添加上了链接也可以作为我学习设计模式的文章的目录。

Java设计模式学习记录-GoF设计模式概述的更多相关文章

  1. Java设计模式学习记录-模板方法模式

    前言 模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 模板方法模式 概念介绍 模板方法模式,其实是很好理解的,具体 ...

  2. Java设计模式学习记录-状态模式

    前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...

  3. Java设计模式学习记录-观察者模式

    前言 观察者模式也是对象行为模式的一种,又叫做发表-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式. 咱们目前用的最多的就是各种MQ(Message Queue ...

  4. Java设计模式学习记录-备忘录模式

    前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...

  5. Java设计模式学习记录-迭代器模式

    前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/ ...

  6. Java设计模式学习记录-解释器模式

    前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...

  7. Java设计模式学习记录-命令模式

    前言 这次要介绍的是命令模式,这也是一种行为型模式.最近反正没有面试机会我就写博客呗,该投的简历都投了.然后就继续看书,其实看书也会给自己带来成就感,原来以前不明白的东西,书上已经给彻底的介绍清楚了, ...

  8. Java设计模式学习记录-享元模式

    前言 享元模式也是一种结构型模式,这篇是介绍结构型模式的最后一篇了(因为代理模式很早之前就已经写过了).享元模式采用一个共享来避免大量拥有相同内容对象的开销.这种开销最常见.最直观的就是内存损耗. 享 ...

  9. Java设计模式学习记录-外观模式

    前言 这次要介绍的是外观模式(也称为门面模式),外观模式也属于结构型模式,其实外观模式还是非常好理解的,简单的来讲就是将多个复杂的业务封装成一个方法,在调用此方法时可以不必关系具体执行了哪些业务,而只 ...

随机推荐

  1. rsync简介与rsync+inotify配置实时同步数据

    rsync简介 rsync是linux系统下的数据镜像备份工具.使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主机同步. rsync特性 rsync ...

  2. Django中的缓存(内存,文件,redis)

    一.Django中的缓存的几种方法 1)单个视图缓存.时间测试 import time from django.views.decorators.cache import cache_page @ca ...

  3. Note of Python Turtle

    Note of Python Turtle         Turtle 库函数是 Python语言中一个流行的绘图函数库.Turtle 意思是海龟,在Python中显示为一个小箭头,通过它的移动而留 ...

  4. PHP查看内存使用

    第一想法:memory_get_usage() 用microtime函数就可以分析程序执行时间memory_get_usage可以分析内存占用空间 SQL的效率可以使用打开慢查询查看日志分析SQL 找 ...

  5. 五、MongoDB的索引

    一.MongoDB的下载.安装与部署 二.MongoDB的基础知识简介 三.MongoDB的创建.更新和删除 四.MongoDB的查询 五.MongoDB的索引 1.简介 它就像是一本书的目录,如果没 ...

  6. UWP忽略短时间内重复触发的事件

    原链接:UWP忽略短时间内重复触发的事件 - 超威蓝火 做移动端开发的可能都会遇到这种需求,当用户点击一个按钮之后,由于没有异步,或者设备性能很差等等原因,程序卡住了.但是用户不知道是咋回事啊,就开始 ...

  7. 文件上传和WAF的攻与防

    Author:JoyChouDate:20180613 1. 前言 本文的测试环境均为 nginx/1.10.3 PHP 5.5.34 有些特性和 语言及webserver有关,有问题的地方,欢迎大家 ...

  8. JS禁用键盘浏览器退格键

    我们在真实的项目开发中经常会使用JS 对键盘上的一些按键进行禁用,常见的比如说退格键(backspace/ 后退键),我在一个项目中就遇到过在页面编辑的时候禁用掉退格键,因为退格键会发生页面后退,这样 ...

  9. vscode 编辑器常用快捷键

    最近,打算换个编辑器,而 vscode 是一个不错的选择.大部分快捷键和 sublime 还是很像的,但有些也不一样.特此整理一份小笔记. 参考: vscode: Visual Studio Code ...

  10. javascript Navigator对象属性和方法

    Navigator对象 Navigator 对象包含的属性描述了正在使用的浏览器.可以使用这些属性进行平台专用的配置.虽然这个对象的名称显而易见 的是 Netscape 的 Navigator 的浏览 ...