GoF设计模式 - 概述
掌握编程语言仅仅意味着掌握了如何给计算机“下命令”,而到底要计算机如何去做,怎么指挥,则是另一个问题——如何编程。设计模式是一套程序员的“武功套路”,它教我们如何去编程。虽然不遵守这个套路也是可以编程的,但是为了做到让整支程序员军团以整齐一致的步伐协调工作,设计模式的存在还是很有必要的。它定义了一系列的“武功套路”以及对应的招式的名称,相当于制定好了行业内的一套规范以及术语,方便程序员军团成员之间相互沟通。
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个模式,就不放到列表里了。
结构型模式
- 适配器模式(Adapter)
- 外观模式(Facade)
- 享元模式(Flyweight)
- 组合模式(Composite)
- 装饰器模式(Decorator)
- 代理模式(Proxy)
- 桥接模式(Bridge)
行为型模式
- 策略模式(Strategy)
- 状态模式(State)
- 职责链模式(Chain of Responsibility)
- 观察者模式(Observer)
- 模板方法模式(Template Method)
- 命令模式(Command)
- 备忘录模式(Memento)
- 迭代器模式(Iterator)
- 调停者模式(Mediator)
- 解释器模式(Interpreter)
- 访问者模式(Visitor)
上述设计模式有链接的表示已经写好了介绍的文章,可以直接戳链接去看对应的文章。
GoF设计模式 - 概述的更多相关文章
- 23种GoF设计模式概述
23种GoF设计模式概述 在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解.后面的章节再进行详细介绍. 创建型模式 关注于怎么创建对象的 ...
- OOAD-设计模式(二)之GRASP模式与GOF设计模式概述
一.GRASP模式(通用责任分配软件模式)概述 1.1.理解责任 1)什么是责任 责任是类间的一种合约或义务,也可以理解成一个业务功能,包括行为.数据.对象的创建等 知道责任——表示知道什么 行为责任 ...
- Java设计模式学习记录-GoF设计模式概述
前言 最近要开始学习设计模式了,以前是偶尔会看看设计模式的书或是在网上翻到了某种设计模式,就顺便看看,也没有仔细的学习过.前段时间看完了JVM的知识,然后就想着JVM那么费劲的东西都看完了,说明自己学 ...
- 【OOAD】设计模式概述
模式的诞生与定义 模式起源于建筑业而非软件业模式(Pattern)之父——美国加利佛尼亚大学环境结构中心研究所所长Christopher Alexander博士<A Pattern Langua ...
- 002-创建型-00-简单工厂【非23种GOF设计模式】
一.概述 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实 ...
- GoF设计模式合集
1 概述 这篇文章是对GoF23种设计模式+1种非GoF模式的合集,由笔者自己的笔记整理而来,每个模式都详细描述了步骤,角色等,以及使用Java实现的具体的例子. 2 基础 设计模式概述 UML与面向 ...
- Java设计模式(一):设计模式概述、UML图、设计原则
1 设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...
- 设计模式(一)----设计模式概述及UML图解析
1.设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...
- GOF设计模式特烦恼
这段时间,学习状态比较一般,空闲时基本都在打游戏,和研究如何打好游戏,终于通过戏命师烬制霸LOL,玩笑了.为了和"学习"之间的友谊小船不翻,决定对以往学习过的GOF设计模式做一个简 ...
随机推荐
- 面向对象设计模式——观察者(OBSERVER)模式
定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...
- Vulkan Tutorial 28 Depth buffering
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 到目前为止,我们所使用的几何图形为3D,但仍然完全扁平的. ...
- thinkphp分页带数据
因为用thinkphp做分页时候点击下一页后搜索栏的数据会清空,然后点击下一页后刷新完了就没有内容了,感觉网上查找和我自己研究在不适用ajax做分页的情况下用以下代码就可以实现!!通过把值扔地址栏来进 ...
- rsync技术报告(翻译)
本篇为rsync官方推荐技术报告rsync technical report的翻译,主要内容是Rsync的算法原理以及rsync实现这些原理的方法.翻译过程中,在某些不易理解的地方加上了译者本人的注释 ...
- [luogu P3128][USACO15DEC]Max Flow [LCA][树上差分]
题目描述 Farmer John has installed a new system of pipes to transport milk between the stalls in his b ...
- python之基本内容
这里提供在使用python进行开发中常使用到的方法技巧,如有不对欢迎批评指正. 要点:开发中类.变量特性查询,类型就是类,断言的使用,深浅复制判断等 python脚本文件是使用UTF-8编码的,所以在 ...
- 【HTML】dl dt dd
摘要 看到没怎么使用过的html 标签,记录下 定义 dl 类似于 ul ,无任何样式,自定义列表容器, ul 为无序列表容器,ol 为有序列表容器 dt dd 类似于 li ,无任何样式,为帮助实现 ...
- 【D3】D3学习轨迹-----学习到一定层度了再更新
1. 首先了解SVG的基本元素 http://www.w3school.com.cn/svg/ 2. 了解d3的专有名词 http://www.cnblogs.com/huxiaoyun90/p ...
- css 为元素选择器,css目标状态伪类,结构化选择器,多媒体选择器,清除表默认样式、属性选择器
伪元素选择器 :before 和 :after 添加的位置 :before --- 第一个子节点 :after --- 最后一个子节点 特点 1.默认是 inline 元素 2.必须包含 conten ...
- VerilogHDL常用的仿真知识
在描述完电路之后,我们需要进行对代码进行验证,主要是进行功能验证.现在验证大多是基于UVM平台写的systemverilog,然而我并不会sv,不过我会使用verilog进行简单的验证,其实也就是所谓 ...