在有了C#语言基础后,在学习设计模式以前,我们还需要学习设计模式的原则,这是设计模式的前提,是我们判断设计是否合理的准则。所以在这篇博客我先学习总结设计模式的原则。
一,单一职责原则(SingleResponsibility Principle,简称SRP):
准确解释:就一个类而言,应该仅有一个引起它变化的原因。
通俗理解:就像P3专门用来听歌,照相机专门用来照相,电视专门用来看电视,收音机专门用来收听广播……它们都有专一的功能,而且做的都非常好,而不要像现在有些手机什么功能都有,却那个功能都做不好。
违背的后果:如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其它功能的能力,这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到破坏。
二,开放—封闭原则(OCP,Open Closed Principle):
准确解释:软件实体(类,模块,函数等等)应该可以扩展,但是不可以修改。
通俗理解:可以从两个方面理解:一,软件实体对于扩展是开放的(open for extension);二,软件实体对于更改是封闭的(closed for modification).也就是说,对于软件实体,我们可以增加一些功能,但是不能修改已实现的功能。也可以说,面对需求,对程序的改动是通过增加新代码来进行的,而不是去修改现有的代码。
重要性:开放—封闭原则是面向对象设计的核心所在,遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护,可扩展,可复用,灵活性好。当然,对于应用程序中的每个部分都刻意的进行抽象同样不是一个好主意,拒绝不成熟的抽象和抽象本身同样重要。
三,依赖倒转原则(DIP,Dependence Inversion Principle):
准确解释:A,高层模块不应该依赖底层模块。两个都应该依赖抽象;B,抽象不应该依赖细节,细节应该依赖抽象。
通俗理解:就是我们要针对接口编程,而不是针对实现编程。举个非常简单的例子,生活中我们的电脑。如果我们的硬盘坏了,换硬盘就可以,主板坏了换主板,内存坏了换内存。也就是说这些零件之间都不相互依赖,而是依赖那个插口。而软件的依赖倒转原则,也就是要达到这种效果。也就是我们经常说的高内聚低耦合。
作用:依赖倒转其实可以说是面向对象设计的标识,用哪种语言编程并不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计。
四,里氏代换原则(Liskov Substitution Principle, LSP):
准确解释:子类型必须能够替换掉它们的父类型;
通俗理解:一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它觉察不出父类对象和子类对象的区别。也就是说在软件里边,把父类都替换成它的子类,程序的行为没有变化。
作用:有了这个原则,只有当子类可以替换掉父类,软件单位的功能不受到影响,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。这里体现继承的效果。
五,迪米特法则(Law ofDemeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP):
准确解释:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。
通俗理解:还是举个例子,一个公司的各个部门通过经理联系起来,经理来协调彼此之间的工作,而两个部门之间没有必要去打交道。回到编程中就是每个类都应当尽量降低成员的访问权限。
根本思想: 就是强调了类之间的松耦合,进而类之间的耦合越弱,越有利于复用。
六,合成聚合复用原则(CompositionAggregation Reuse Principle ,CARP)
准确解释:尽量使用合成/聚合,尽量不要使用类继承。就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。
优点:优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上,这样类和类继承会保持较小规模,并且不太可能增长为庞然大物。目的还是高内聚低耦合。
综上,为我们学习设计模式的六大原则,而且也是我们进行编程的重要原则,这是需要我们去遵守的,只有保证了这些原则,我们的程序,才会达到面向对象的根本目的:可维护,可扩展,可复用,灵活性好。