作者:云都小生
我眼中的设计模式
经过几个月的努力,除了解释器模式外,其他模式我都做了简单的了解。由于 解释器模式的难度稍大,并且使用场景也并不是很广泛,便暂时放下了。
如果把各类编程语言比喻成“招式”,把各类IDE比喻成“工具”,那设计模式就是一种“内功心法”。招式和工具所有的武林高手都能掌握, 但是内功心法却不一定,这也自然而然的成为了高手与菜鸟之间分水岭。
为什么把标题写成“世上本无设计模式”呢?实际上,设计模式的概念一开始来源于建筑学。
在建筑学中,人们对舒适住宅和城市环境存在一些共同的认同规律。有大师把这些“共同认知”最后被汇成许多成熟的模式,只要碰到相同的问题、条件,既可以直接采用成熟的模式,以节省时间提升效率。
而在软件开发领域,同样经常会碰到许多相同的需求、条件、场景相同的问题,如果每个人都需要自己经常琢磨出一套成熟的模式来应对,那效率实在是低得可怕。设计模式就是一套由前人不断累积经验、迭代升级并且可重用的、成熟的代码设计模式,一套解决特定问题的指导方针。
神奇的是,这套内功心法,无论你学的是什么招式(编程语言),无论你是什么门派(平台),无论你用的是什么工具(IDE),了解后对你必定有大量的好处。
它能帮助提高开发的效率和难度,同时也能帮助我们设计出扩展性强、耦合度低、效率高的程序架构。
其实我个人更喜欢把设计模式,看成是代码设计的规范。这是我们每一个程序员都应该遵守的一套代码标准,也是每一个优秀程序员都必须具备的“基本素质”。
设计模式的分类
设计模式通常可以分为三类: 创建型、结构型、行为型
创建型设计模式,处理的是有关对象创建的问题。
结构型设计模式,处理的是类或对象之间的组合关系。
行为型设计模式,处理的是类或对象之间怎么进行交互怎么进行职责分配。
面向对象基本设计原则
几乎所有设计模式和设计原则,背后的本质都是六个字“高内聚、低耦合”。这六个字几乎贯穿了整个面向对象的核心,它要求同一模块内相关代码的紧密度越高越好,同时也要求不同模块之间处于一种弱关系,保持各自的独立性。
让我们开始总结面向对象的基本设计原则
单一职责原则:一个类只负责一个功能,如果一个类负责的的功能过多,那就会提高一个类的维护成本和复杂度。承担的职责越多,被复用的可能性就越小,引起它变化的原因越多,越有可能会影响其他职责的运作。
开闭原则:一个类应该对扩展开放,对修改关闭。这个原则追求程度是——在不修改原代码的情况下还能够进行扩展。在这个原则中,抽象是十分关键的。
里氏代换原则:任何基类可以出现的地方,子类一定可以出现,尽量使用父类引用指向子类对象的方式来编程。其实这个原则,我们在学习多态的时候就很清楚了——子类能够转为父类,但父类不一定能转成子类,子类之间也不能随意转换。
依赖倒转原则:针对接口编程,而不是针对实现编程。在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,而不要用具体的子类。依赖倒转原则就是面向对象设计的主要实现机制之一,它是系统抽象化的具体实现。
刘伟老师的在自己设计模式系列的文章中,有这么一句话让我印象深刻——在面向对象设计过程中,开闭是目标,里氏代换是基础,依赖倒转是手段。
接口隔离原则:使用多个专门的接口,而不使用单一的总接口。这要求我们在定义接口的时候,尽量使接口承担独立的角色。如果定义一个庞大的接口,那么子类在实现这个接口后,会有许多根本利用不到的属性、方法,灵活性会降低。
复用原则:尽量使用对象组合,而不是继承来达到复用的目的。滥用继承经常会碰到很多的难题,一旦父类需要进行改变,子类就会受到影响。并且,父类经常会的属性、行为毫无保留的暴露给子类,这破坏了封装。通过组合的方式,可以对这种强关系进行解耦,使系统更灵活。
迪米特原则:尽量不要跟“陌生人”说话。这个原则要求我们,尽量减少对象之间的交互,能不直接接触就不直接接触。类之间的耦合度越低,就越有利于复用,其中一个类修改了,也不会对其他类产生太大的影响。
设计模式阅兵
我采用最简短的方式来总结每一个设计模式,点击设计模式的名称,可以转到对应的学习笔记。
简单工厂模式:将对象创建的工作封装到一个工厂里,客户端无需用new就能得到新创建的对象。
工厂方法模式:针对每一个对象都提供一个工厂,不再局限于统一的工厂。
抽象工厂模式:对需要创建的对象进行分类,按照一定的分类,将对象创建封装在不同的工厂里。
单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
原型模式:实现对象的自我克隆。
建造者模式:解决复杂对象的组装、创建问题。
适配器模式:解决类(接口)或对象之间不兼容的问题,使不兼容的类或对象可以一起工作。
桥接模式:实现系统中两个独立变化维度的解耦。
组合模式:组合多个对象形成树形结构,以表示具有“整体—部分”关系的层次结构。
装饰模式:动态地给一个对象增加一些额外的职责。
外观模式:将客户类与子系统的内部复杂性分隔开。
享元模式:实现对象的复用。
代理模式:解决访问某个对象存在困难的问题。
职责链模式:对请求进行链式处理。
命令模式:对请求的发送者和接受者进行解耦。
迭代器模式:实现遍历聚合对象中的元素。
中介者模式:协调多个对象之间的交互问题。
备忘录模式:实现撤销功能。
观察者模式:通过观察者,实现对象之间的联动。
状态模式:解决一个对象多种状态之间的相互转换。
策略模式:>实现算法的封装和切换。
模板方法模式:基于继承,实现代码复用。
访问者模式:解决多个访问者对同一对象操作的问题。
总结
设计模式就是一套经过许多前辈迭代、升级的成熟兵法,就像三十六计一样,对应着不同的使用场景。掌握这套兵法,可以使我们更加便捷、快速、高效的解决某些频繁出现的问题。
我个人觉得学习设计模式最顶尖的状态,便是忘掉自己所学习的设计模式。将许多设计规范都刻入到自己的开发细胞中,碰到固定的问题,懂得分析利弊,自动触发成熟的打法。
对于设计模式的学习,我推荐的学习方式是,首先做简单的了解。简单的了解后,再自己寻找生活中的案例独立去实现,慢慢掌握各种打法。最后再去找真实案例,不断实践、磨合。
推荐学习资料:史上最全的设计模式导学目录,我学习也是根据这套导学目录来的。至于我的笔记,我并不是在复制、拷贝该作者的内容,而是希望能够通过模仿高人、学习高人的方式,来推动自己的学习。
2018/4/20 13:24:25 @Author:云都小生