世上本无设计模式——设计模式总结


作者:云都小生


我眼中的设计模式



经过几个月的努力,除了解释器模式外,其他模式我都做了简单的了解。由于 解释器模式的难度稍大,并且使用场景也并不是很广泛,便暂时放下了。

如果把各类编程语言比喻成“招式”,把各类IDE比喻成“工具”,那设计模式就是一种“内功心法”。招式和工具所有的武林高手都能掌握, 但是内功心法却不一定,这也自然而然的成为了高手与菜鸟之间分水岭。

为什么把标题写成“世上本无设计模式”呢?实际上,设计模式的概念一开始来源于建筑学。

在建筑学中,人们对舒适住宅和城市环境存在一些共同的认同规律。有大师把这些“共同认知”最后被汇成许多成熟的模式,只要碰到相同的问题、条件,既可以直接采用成熟的模式,以节省时间提升效率。

而在软件开发领域,同样经常会碰到许多相同的需求、条件、场景相同的问题,如果每个人都需要自己经常琢磨出一套成熟的模式来应对,那效率实在是低得可怕。设计模式就是一套由前人不断累积经验、迭代升级并且可重用的、成熟的代码设计模式,一套解决特定问题的指导方针。

神奇的是,这套内功心法,无论你学的是什么招式(编程语言),无论你是什么门派(平台),无论你用的是什么工具(IDE),了解后对你必定有大量的好处。

它能帮助提高开发的效率和难度,同时也能帮助我们设计出扩展性强、耦合度低、效率高的程序架构。

其实我个人更喜欢把设计模式,看成是代码设计的规范。这是我们每一个程序员都应该遵守的一套代码标准,也是每一个优秀程序员都必须具备的“基本素质”。


设计模式的分类



设计模式通常可以分为三类: 创建型、结构型、行为型

创建型设计模式,处理的是有关对象创建的问题。

结构型设计模式,处理的是类或对象之间的组合关系。

行为型设计模式,处理的是类或对象之间怎么进行交互怎么进行职责分配。


面向对象基本设计原则


几乎所有设计模式和设计原则,背后的本质都是六个字“高内聚、低耦合”。这六个字几乎贯穿了整个面向对象的核心,它要求同一模块内相关代码的紧密度越高越好,同时也要求不同模块之间处于一种弱关系,保持各自的独立性。

让我们开始总结面向对象的基本设计原则

单一职责原则:一个类只负责一个功能,如果一个类负责的的功能过多,那就会提高一个类的维护成本和复杂度。承担的职责越多,被复用的可能性就越小,引起它变化的原因越多,越有可能会影响其他职责的运作。

开闭原则:一个类应该对扩展开放,对修改关闭。这个原则追求程度是——在不修改原代码的情况下还能够进行扩展。在这个原则中,抽象是十分关键的。

里氏代换原则:任何基类可以出现的地方,子类一定可以出现,尽量使用父类引用指向子类对象的方式来编程。其实这个原则,我们在学习多态的时候就很清楚了——子类能够转为父类,但父类不一定能转成子类,子类之间也不能随意转换。

依赖倒转原则:针对接口编程,而不是针对实现编程。在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,而不要用具体的子类。依赖倒转原则就是面向对象设计的主要实现机制之一,它是系统抽象化的具体实现。

刘伟老师的在自己设计模式系列的文章中,有这么一句话让我印象深刻——在面向对象设计过程中,开闭是目标,里氏代换是基础,依赖倒转是手段。

接口隔离原则:使用多个专门的接口,而不使用单一的总接口。这要求我们在定义接口的时候,尽量使接口承担独立的角色。如果定义一个庞大的接口,那么子类在实现这个接口后,会有许多根本利用不到的属性、方法,灵活性会降低。

复用原则:尽量使用对象组合,而不是继承来达到复用的目的。滥用继承经常会碰到很多的难题,一旦父类需要进行改变,子类就会受到影响。并且,父类经常会的属性、行为毫无保留的暴露给子类,这破坏了封装。通过组合的方式,可以对这种强关系进行解耦,使系统更灵活。

迪米特原则:尽量不要跟“陌生人”说话。这个原则要求我们,尽量减少对象之间的交互,能不直接接触就不直接接触。类之间的耦合度越低,就越有利于复用,其中一个类修改了,也不会对其他类产生太大的影响。


设计模式阅兵



我采用最简短的方式来总结每一个设计模式,点击设计模式的名称,可以转到对应的学习笔记。

简单工厂模式:将对象创建的工作封装到一个工厂里,客户端无需用new就能得到新创建的对象。

工厂方法模式:针对每一个对象都提供一个工厂,不再局限于统一的工厂。

抽象工厂模式:对需要创建的对象进行分类,按照一定的分类,将对象创建封装在不同的工厂里。

单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

原型模式:实现对象的自我克隆。

建造者模式:解决复杂对象的组装、创建问题。

适配器模式:解决类(接口)或对象之间不兼容的问题,使不兼容的类或对象可以一起工作。

桥接模式:实现系统中两个独立变化维度的解耦。

组合模式:组合多个对象形成树形结构,以表示具有“整体—部分”关系的层次结构。

装饰模式:动态地给一个对象增加一些额外的职责。

外观模式:将客户类与子系统的内部复杂性分隔开。

享元模式:实现对象的复用。

代理模式:解决访问某个对象存在困难的问题。

职责链模式:对请求进行链式处理。

命令模式:对请求的发送者和接受者进行解耦。

迭代器模式:实现遍历聚合对象中的元素。

中介者模式:协调多个对象之间的交互问题。

备忘录模式:实现撤销功能。

观察者模式:通过观察者,实现对象之间的联动。

状态模式:解决一个对象多种状态之间的相互转换。

策略模式:>实现算法的封装和切换。

模板方法模式:基于继承,实现代码复用。

访问者模式:解决多个访问者对同一对象操作的问题。


总结



设计模式就是一套经过许多前辈迭代、升级的成熟兵法,就像三十六计一样,对应着不同的使用场景。掌握这套兵法,可以使我们更加便捷、快速、高效的解决某些频繁出现的问题。

我个人觉得学习设计模式最顶尖的状态,便是忘掉自己所学习的设计模式。将许多设计规范都刻入到自己的开发细胞中,碰到固定的问题,懂得分析利弊,自动触发成熟的打法。

对于设计模式的学习,我推荐的学习方式是,首先做简单的了解。简单的了解后,再自己寻找生活中的案例独立去实现,慢慢掌握各种打法。最后再去找真实案例,不断实践、磨合。

推荐学习资料:史上最全的设计模式导学目录,我学习也是根据这套导学目录来的。至于我的笔记,我并不是在复制、拷贝该作者的内容,而是希望能够通过模仿高人、学习高人的方式,来推动自己的学习。

2018/4/20 13:24:25 @Author:云都小生

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值