掌握编程语言仅仅意味着掌握了如何给计算机“下命令”,而到底要计算机如何去做,怎么指挥,则是另一个问题——如何编程。设计模式是一套程序员的“武功套路”,它教我们如何去编程。虽然不遵守这个套路也是可以编程的,但是为了做到让整支程序员军团以整齐一致的步伐协调工作,设计模式的存在还是很有必要的。它定义了一系列的“武功套路”以及对应的招式的名称,相当于制定好了行业内的一套规范以及术语,方便程序员军团成员之间相互沟通。

GoF的23种设计模式

GoF是指Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides四个人,他们四个人被称为Gang of Four,缩写GoF。这四个人曾经合著过一本书《Design Patterns: Elements of Reusable Object-Oriented Software》,也就是大名鼎鼎的《设计模式》一书。此书流传很广,已经是程序员界的圣经之一了。这本书中介绍了23种设计模式,虽然设计模式其实不止这23种,但是由于这23种太常用了,所以我们一般说到设计模式,就是指GoF的23种设计模式。本文后续说的设计模式也将默认设计模式为GoF的23种设计模式。另外,我的第一语言是Java,Java也几乎是OO界默认的语言,所以后续文章将使用Java。文章中出现的示例代码将同步更新到java-design-pattern-samples项目

六大原则

所有的设计模式都遵循以下六个基本的设计原则。

  • 单一职责原则: The Single Responsibility Principle(SRP)
  • 开放封闭原则: The Open Closed Principle(OCP)
  • 里氏替换原则: The Liskov Substitution Principle(LSP)
  • 迪米特法则: The law of Demeter(LD)
  • 接口隔离原则: The Interface Segregation Principle(ISP)
  • 依赖倒置原则: The Dependency Inversion Principle(DIP)

六大设计原则取其英文首字母简称为SOLID原则。( ′◔ ‸◔`) 咦!不是六大原则吗!为啥缩写只有五个字母!
这个。。。我还真不知道!或许是把里氏替换原则和迪米特法则的两个L合并成一个更好看吧!如果有知道原因的朋友可以在博客中留言告诉我!

单一职责原则

一个类只做一件事情,不要去做与这个类的主要职责无关的事情。

开放封闭原则

对扩展开放,对修改关闭。简单的说就是类或者接口定义好之后不可进行破坏性的更新!如果没有bug,或者修改类、接口不是为了改进内部实现机制就不应该去修改这个类。开闭原则的目的是为了保持类或者接口后续版本能够向后兼容,这是一个最根本的原则。开闭原则是六大原则中最重要的一个,算是一个总原则吧!

虽然理论上我们应该严格遵守开闭原则,不过现实往往没有那么理想化。任何一个软件在设计的时候都无法预料到后续发展中的所有需求,所以现实情况是修改几乎不可避免。比如Java8中为了stream加了个毁三观的default方法,这就是一个活生生的例子。我们只能在进行设计的时候尽可能的去遵守这些原则!

和我一起在心里默念几次程序员圣经中的上帝指示:对扩展开放,对修改关闭!对扩展开放,对修改关闭!对扩展开放,对修改关闭!

里氏替换原则

所有父类可以出现的地方,都可以透明的用子类替换。也就是说,子类可以扩展父类,但是不可以修改父类的原有功能。子类 is a 实现 of 父类

迪米特法则

迪米特法则又叫最少知识原则Least Knowledge Principle(LKP),意思是一个类应该对他自己所依赖的类知道的越少越好!我们的目标是:没有蛀牙!:-) 开玩笑的!应该是:高内聚,低耦合。

接口隔离原则

使用多个小的更具体的接口比使用一个臃肿的接口要更好!也就是说,优雅的程序需要精心呵护,所以为了保护她,我们应该鄙视太粗的接口,应该喜欢细一点的接口。:-) 我知道你们在想什么,不过本司机指的不是你想的那个意思!
细一点的接口有利于重构!:-) 原则就是被用来违反的!对修改关闭?怎么可能!谁写的代码可以一步到位永久不修改的吗!
另外细一点的接口也有利于客户端遵守最少知识原则。

依赖倒置原则

不要依赖具体实现,要依赖抽象!也就是面向“接口”编程而不是面向实现类编程!这样做可以解除客户端与实现类的耦合。

六大设计原则总结

开闭原则要求我们写好的类不要去修改,如果需要增加功能,那么扩展它。单一职责原则要求我们一个类只做一件事情。里氏替换原则要求我们子类必须兼容父类。迪米特法则要求我们尽可能少的依赖其他的类。接口隔离原则要求我们定义接口的时候尽可能简单一些。依赖倒置原则要求我们不能去依赖实现类!

设计模式分类

GoF23种设计模式一般分为三大类。

创建型模式

除此之外,简单工厂模式(Simple Factory)应该也算。不过为了凑整23个模式,就不放到列表里了。

结构型模式

行为型模式

上述设计模式有链接的表示已经写好了介绍的文章,可以直接戳链接去看对应的文章。

GoF设计模式 - 概述的更多相关文章

  1. 23种GoF设计模式概述

    23种GoF设计模式概述 在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解.后面的章节再进行详细介绍. 创建型模式 关注于怎么创建对象的 ...

  2. OOAD-设计模式(二)之GRASP模式与GOF设计模式概述

    一.GRASP模式(通用责任分配软件模式)概述 1.1.理解责任 1)什么是责任 责任是类间的一种合约或义务,也可以理解成一个业务功能,包括行为.数据.对象的创建等 知道责任——表示知道什么 行为责任 ...

  3. Java设计模式学习记录-GoF设计模式概述

    前言 最近要开始学习设计模式了,以前是偶尔会看看设计模式的书或是在网上翻到了某种设计模式,就顺便看看,也没有仔细的学习过.前段时间看完了JVM的知识,然后就想着JVM那么费劲的东西都看完了,说明自己学 ...

  4. 【OOAD】设计模式概述

    模式的诞生与定义 模式起源于建筑业而非软件业模式(Pattern)之父——美国加利佛尼亚大学环境结构中心研究所所长Christopher Alexander博士<A Pattern Langua ...

  5. 002-创建型-00-简单工厂【非23种GOF设计模式】

    一.概述 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实 ...

  6. GoF设计模式合集

    1 概述 这篇文章是对GoF23种设计模式+1种非GoF模式的合集,由笔者自己的笔记整理而来,每个模式都详细描述了步骤,角色等,以及使用Java实现的具体的例子. 2 基础 设计模式概述 UML与面向 ...

  7. Java设计模式(一):设计模式概述、UML图、设计原则

    1 设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...

  8. 设计模式(一)----设计模式概述及UML图解析

    1.设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...

  9. GOF设计模式特烦恼

    这段时间,学习状态比较一般,空闲时基本都在打游戏,和研究如何打好游戏,终于通过戏命师烬制霸LOL,玩笑了.为了和"学习"之间的友谊小船不翻,决定对以往学习过的GOF设计模式做一个简 ...

随机推荐

  1. 优雅的封装ajax,含跨域

    之前写过一篇 先定一个小目标,自己封装个ajax,是基于原生js的,也就是jquery中ajax的简化版本实现的思路.众所周知,jquery的ajax是项目中最常用的请求后台的方式,也算是封装的很完美 ...

  2. PHP中的数据结构

    PHP7以上才能安装和使用数据结构,安装比较简单: 1. 运行命令 pecl install ds 2. 在php.ini中添加 extension=ds.so 3. 重启PHP或重载配置  Coll ...

  3. Dapper.Rainbow 简单使用

    一.  Dapper 简介        一个效率比较高的微型ORM.   二 . Dapper.Rainbow        Dapper的扩展,在这个扩展里面实现了 Dynamic 的 插入和更新 ...

  4. docker~Dockerfile方式建立镜像HelloWorld

    回到目录 Dockerfile可以便捷的建立一个image,它可以在一个镜像基础上,去构建另一个镜像,这也许就是它的特色,也是docker的本意! 我们下载一个mono的镜像 docker pull ...

  5. new DefaultHttpClient过时处理建议和HTTP调用后关闭流处理

    因为工作中经常会写点接口类需求,写完HTTP的接口后,就要写测试类来调下服务端的代码.最近写新的测试调用代码时候,发现项目中new DefaultHttpClient()实例过期很久了,于是查阅了些资 ...

  6. 【PHP】this,self,parent的区别(转)

    一. 定义&区别 self: 指向当前类的指针,self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量. this: 指向当前对象的指针,使用parent来调用父类的构造函 ...

  7. ETL作业调度工具TASKCTL软件安装乱码问题解决

    前两天在安装批量作业调度软件TASKCTL4.5时,将安装介质解压出来后执行安装脚本时,一安装就出现下图乱码. 然后就度娘了一下,发现安装遇到乱码的人还挺多的,大多数解答都说TASKCTL软件里面很多 ...

  8. 蓝桥杯比赛javaB组练习《方格填数》

    方格填数 如下的10个格子   +--+--+--+   |  |  |  |+--+--+--+--+|  |  |  |  |+--+--+--+--+|  |  |  |+--+--+--+ ( ...

  9. java笔录---反射机制(1)

    引言   为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架,   像spring中核心模块IO ...

  10. [补档]Cube

    Cube 题目 给你一个n×m的棋盘,有一个1×1×2的长方体竖直放在(1,1)上,你可以将其在棋盘上滚动,你的目标是让其竖直放在(n,m)上,问至少需要多少次操作.(放倒.竖直.翻滚) INPUT ...