设计模式之单一职责

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/xufei_0320/article/details/86095168

想要精通设计模式,必须要先搞清楚设计模式的六大原则。

在开始设计模式之前,先来谈谈设计模式的六大设计原则,第一个便是单一职责原则(Single Responsibility Principle)了。

单一职责原则定义

There should never be more than one reason for a class to change.

这句话意思很简单,不应该存在多于一个导致类变更的原因。通俗来说就是,一个类应该只有一项职责,不会有多个原因导致类发生变更。

问题由来

我们设计这样一个接口

public interface IUserInfo {
    void setUsername();
    void changePassword();
}

很明显看到这样一个接口,谁都会觉得有问题,用户属性怎么可以和用户行为放在一起。肯定应该是用户属性放一起,用户行为放一起啊。

单一职责解决问题

对啊,根据这样的想法,我们把刚刚的接口拆成两个接口。

public interface IUserInfo {
    void setUsername();
}
public interface IUserBiz {
    void changePassword();
}

其实这就是单一职责原则。
有人可能就要说了,这也太简单了吧。对啊,对于一个从未接触过设计模式的小白来说,在设计接口的时候,都会去这么设计的。
是啊,真的很简单,可是有时候却又十分的难去实现,因为职责的划分很难,就比如手机打电话来说

public interface Iphone {
    void dial(String phoneNumber);
    void chat(Object o);
    void hangup();

}

这里我们定义一个手机接口,我们来划分职责,接通和挂断应该是通信协议上的,而聊电话则是数据传输。那按照单一原则来说,我们应该给它们也拆到两个接口中去,但是拆开之后呢,我们会发现,当我想打电话的时候我需要将他们再组装到一起,这样反而是增加了系统的复杂度,我想平时遇到类似情况的时候,我们都是放在一个接口中的。

另一方面,职责扩散,就是由于某种原因,导致原来单一的职责变成了若干了更细粒度的职责。这时候如果再去拆分,代价还是比较高的。

优点

单一职责原则会有以下优点:

  1. 降低了类的复杂度,实现什么职责都有清晰明确的定义。
  2. 提高了可读性。
  3. 提高了可维护性。
  4. 变更引起的风险降低,变更是必不可少的,如果接口的单一职责做得好,一个接口修改只对相应的实现类有影响,对其他的接口无影响,这对系统的扩展性、维护性都有非常大的帮助。

总结

看到过大佬有这样的说法,只有逻辑足够简单,才可以在方法级别上违反单一职责原则,只有类中方法数量足够少,才可以在类级别上违反单一职责原则。

单一职责原则看起来很简单,做起来却很难,单一职责原则提出了一个编写程序的标准,用“职责”或“变化原因”来衡量接口或类的设计是否优良,但是“职责”和“变化原因”都是不可度量的,因项目而异,因环境而异。

因此对于单一职责原则,我的建议是接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。

猜你喜欢

转载自blog.csdn.net/xufei_0320/article/details/86095168