设计模式本质思想

依赖接口不依赖实现

依赖接口不依赖实现是模块化的重要思想。比如可以通过sort执行排序,sort是用合并排序快速排序我们不用管,哪天感觉排序不够快直接换算法,应用层不需要改动。再比如不管是手机、U盘还是移动硬盘,都能通过USB接口连接电脑。

对已有功能封装接口

比如笔记本不支持PS/2接口,可以通过USB转换器连接PS/2接口键盘。典型的设计模式是适配器模式。从本质来讲封装接口的目的还是避免依赖实现,和第一条没区别。

通过以上例子看出,接口思想并不仅仅用于软件开发。哪怕是在软件开发领域,接口技术也绝非面向对象独有。Linux处理所有东西都当文件,Windows界面元素都是HWND,这些思想广泛应用的时候,面向对象语言还没出生。

组合代替继承

先看个例子。有个鸟类,有Move、Voice、Eat方法。在系统中Move有Swim、Fly、Walk三种,Voice有”唧唧““嘎嘎”“咕咕”三种,Eat有吃肉、吃虫、吃种子三种。假设三种方法可以随意组合,如果用继承的方式,需要3*3*3=27个子类才能实现所有类型的鸟,并且会有重复代码。把Move、Voice、Eat弄成函数对象、接口、函数指针等可以随意替换的东西,只需要3+3+3=9个然后随便组合,就是策略模式。

继承使得成员和类型紧密的结合在一起,耦合度非常高,变化非常不灵活。组合代替继承完全是为了弥补面向对象语言这一缺陷。

单例模式没体现上面的思想,不过跟面向对象也没任何联系。

大致扫一下常见的设计模式:

观察者模式:依赖接口+组合

适配器模式:封装接口

代理模式:封装接口

桥接模式:依赖接口+组合

中介者模式:可以定向发送消息的观察者模式

责任链模式:有严格顺序且可以中断的观察者模式

享元模式:组合代替继承,不同的就是组合的是属性而非方法。还有人跟我纠结方法和属性的不同,在这里没本质区别。

访问者模式:依赖接口

抽象工厂模式:依赖接口

工厂方法模式:使用组合的抽象工厂模式

生成器模式:使用组合+封装接口

外观模式:封装接口

设计模式在使用中免不了生搬硬套,似是而非,因为这些模式的应用范围非常窄,远远没有鼓吹的那么具有通用性。掌握本质之后就可以灵活组织代码结构。就这么点玩意被当成圣经炒好几十年,也该消停点了。

你可能感兴趣的:(设计模式本质思想)