核心:一个类,最好只做一件事,只有一个引起它变化的原因。
单一职责原则的英文名称是Single Responsibility Principle,简称是SRP,There should never be more than one reason for a class to change.类的改变不应该由一个以上的原因导致,也就是说不应该有一个以上的原因可以导致类的改变。
如果类的职责超过一个,这些职责之间就会产生耦合。改变一个职责,可能会影响和妨碍类为其他人服务的功能。这种类型的耦合将会导致脆弱的设计,在修改的时候可能会引入未逾期的问题。
如上图所示,Rectangle类有两个方法:一个是在屏幕上画矩形,一个是计算矩形的面积。两个不同的应用会使用Rectangle类,一个应用使用Rectangle来帮助计算面积,它从来不会在屏幕画矩形。另外一个是图形界面的应用,也可能会计算面积,但是肯定会在屏幕画矩形。
当前的设计就违反了SRP原则,Rectangle类有两个职责,一个是为数学模型提供几何的矩形,计算面积;另外一个职责是为图形用户界面提供矩形的显示。
这个违反SRP原则的设计会导致很多严重的问题。首先,在计算几何应用中必须包含GUI。因为计算几何应用可能就是一个控制台程序,不需要用户界面,但是由于需要使用这个违反SRP原则的类,就必须要包含GUI的类库,在编译的时候要同时编译,在部署的时候还增加了部署的内容,而且这些内容可能永远都不会被用到。
其次,如果图形应用的变化,需要修改Rectangle类的话。我们的计算几何应用也必须要重新编译和部署,因为它也引用了相同的Rectangle类,如果不那么做的话,可能会发生意外的错误(因为Rectangle类被修改了,不知道有没有什么影响)。
好一点的做法是将Rectangle分解为两个类,如下图所示
![](https://i-blog.csdnimg.cn/blog_migrate/c5fbc963f25af27fa5caa9b74cf38664.jpeg)
{
public void Dial( string no);
public void Hangup();
public void Send( char c);
public char Reveive();
}
我们中的大多数人认为上面的接口已经设计的不错了,四个功能也都是modem的功能。
![](https://i-blog.csdnimg.cn/blog_migrate/9ad6b3c1f39cbdc5137b1241ef2e2932.jpeg)