引言
我觉得编码是有灵魂的,就像每个人都有信仰一样。那么如何去体现信仰,如何凸显灵魂就需要依赖它所固有的原则。最近学习了设计模式的六大原则,有所感悟,特此做总结和记录。本文中主要介绍了关于开闭原则的理解和定义,同时我们总结一下所有前面的五大原则对开闭原则的影响。笔者目前整理的一些blog针对面试都是超高频出现的。大家可以点击链接:http://blog.csdn.net/u012403290
开闭原则
以下是正式的解释:
开闭原则(OCP)是面向对象设计中“可复用设计”的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段。对于扩展是开放的,对于修改是关闭的
从中可以看出,开闭原则的核心是“可复用”,它具有两大特征:①对于拓展是开放的;②对于修改是关闭的。举个例子,比如说HashMap是实现了Map接口的,那么如果需要拓展功能,那么就修改HashMap而不用去修改Map接口,同时Map是禁止修改的(因为修改接口,会强制要求所有实现要做相应修改,牵一发而动全身)。那么前者就是开放的,后者就是关闭的。再延伸一点,其实抽象是非常灵活的,而具体的实现是非常丰富的,我们在设计的时候,尽量不去修改抽象,而是要去修改具体实现。用别人总结的话就是:“用抽象构建框架,用实现扩展细节”。
设计模式总纲领
对于设计模式的几天研究,我总结了各个原则的关系,并表现在了图中,或许有些人看来和你想的不太一样,请不要介意。概念化的东西一千个人会有一千种思想的。
这个是博主自己总结的,个人觉得设计模式主要实现的是开闭原则,而所有下层原则所追求的就是开闭原则。接下来,我们一一对其解释:
1、里氏替换原则:我给它命名叫亘古不变。意思就是在继承的过程中,要保证不破坏父类的功能,子类可以自由的扩展自己的功能。它主要针对继承关系中,体现在具体实现中(如果父类是抽象的,就无所谓破坏了)。所以它是遵循开闭原则的,父类不可变动,子类可自由拓展,不破坏继承的关系。
2、迪米特原则:我给它命名叫独身自好。意思就是不要去管别人,管好自己就好。主要体现在两个方面:①只和自己的朋友说话,不和陌生人说话;②增加自己类的内聚性;所以命名独身自好,博主觉得挺好的。它主要针对的是类与类之间的关系,同时它体现在具体实现中。所以它也是遵循开闭原则的,高内聚,低耦合。
3、单一职责原则:我给它命名恪尽职守。意思就是类认真做好自己分内的事。它主要针对的是类与类的关系,体现在具体的实现中。恪尽职守的好处是,每个类都独立的,更好的完成自己分内的事,所以它也是遵循开闭原则的,它使得类与类之间的耦合性会很低。
4、依赖倒置原则:我给它命名主次分明。意思就是在涉及层次的时候,不要被表面的依赖误导了,要以抽象为主,具体实现要依赖抽象。主要是要求要面向接口编程,也就是要面向抽象编程。它主要是针对接口和抽象类,主要体现在抽象中。所以它也遵循开闭原则的,以抽象为架构,用实现来完善细节。
5、接口隔离原则:我给它命名量身定做。意思就是当一个类去实现接口的时候,接口中这些方法是恰恰好给这个类的,对于这个类来说这个接口是给它量身定做的。它主要针对接口和抽象类,主要体现在抽象中。所以它也是遵循开闭原则的,它使得模块之间耦合性更低,层次更清晰。
过犹不及
在前面的文章中,我也多次提及“墨守成规”的问题,设计模式六大原则,如果每一步都严格遵循会产生很多问题(比如说迪米特原则,那么它会产生很多友元类)。所以在设计过程中,如何掌握原则的度量需要对实际情况进行分析。比较两者代价与开销,选择更恰当的实现方式,不然过犹不及会让你有一种无力感。
下图是我对设计模式原则遵循程度和项目优雅性画的一张图(仅个人想法):
后记
好了,设计模式六大原则到这里也算是完美结束了。后面可能要继续写一些面试中的核心问题,目前整理了很多面试题目,我会挑一些好的,写成博文和大家一起探讨。