在上篇博文中提到了开放—封闭原则,没有细谈,这次我们来总结一下设计模式的几大原则。
1开放—封闭原则:是指软件实体(类、模块、函数等)应该可以扩展,但是不可修改。
对原则的理解:开闭原则是最具有理想主义色彩的一个原则,它是面向对象设计的终极目标,下面所要介绍的几个原则可以看成是为了符合开闭原则所作的努力和解决办法。对于开闭原则通俗的理解就是,能不改就不改,能少改尽可能的少改。周所周知,物质是运动的,世界是变化的,想要让一个事物永恒不变是不可能的,所以要想让软件绝对符合开闭原则是不可能的。
2单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因。
通俗来讲,就是一个类或者是一个模块只干一件事,或者说这个类或者模块只扮演一种角色,它只需将自己负责的活儿干好就行,其他的一概不管,绝对不能瞎掺和。比如我们在做软件的时候,定义了一个类是负责连接数据库的,至于连接上之后的数据操作就交给其他的函数去做,别都自己揽过来,到时候万一要换数据库那就麻烦了。
3依赖倒转原则:A 高层模块不应该依赖底层模块。两个都应该依赖抽象。B 抽象不应该依赖细节,细节应该依赖抽象。
通俗来说,就是要针对接口编程,不要针对实现编程。在面向过程的软件开发时,为了能够实现代码复用,通常会吧常用的一些代码写成函数,大量的函数就组成了函数库,这样在做新的项目时,就可以去调用这些底层的函数,这就是所谓的高层模块依赖底层模块。而我们要达到的目的是高层模块和低层模块没有很强的耦合性,任何一方都可以很容易的被复用,这样我们就要想办法对他们之间的接口进行设计和编程,在复用的时候只需修改接口或者抽象类即可。
4里氏代换原则:子类型必须能够替换掉它们的父类型。
这个原则的定义很短,相信应该不难理解,说白了就是一个软件实体如果使用的是一个父类的话,那么将父类都替换成它的子类,则程序依然能够编译通过,并且正常运行。可以说里氏代换原则是继承复用技术的基础。举个例子,动物类为父类,猫,狗,牛,羊为其子类,当我们实例化一个动物类的对象:动物 animal= new 猫()后,猫具有了父类动物的吃喝拉撒等方法,而当用狗替换掉猫即:动物 animal =new 狗(),依旧可以编译运行,没有任何不和谐的地方。这就是里氏代换原则的体现。
5迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
对原则的理解:迪米特法则有一个别名叫做最少知识原则,其核心的思想就是尽可能的降低类与类之间的耦合性,说白了就是不要和陌生类交流,就如同我们要找人办事一样,能帮得了你的人,你不认识,那么你就会找一个你认识的同时对方也认识的人做中间人,让这个中间人来帮你传达你的意思,这样就能很好地完成你想要做的事。
6合成/聚合复用原则:尽量使用合成/聚合,尽量不要使用类继承。
所谓聚合表示的是一种弱的拥有关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;合成则是一种强的拥有关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。在编程中优先使用对象的合成/聚合将有助于保持每个类被封装,并被集中在单个任务上,这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。
我们在进行软件设计的时候,尽量遵循以上原则,力争写出可维护,可复用,可扩展,灵活性好的代码。