单一职责原则

电话通话的时候有四个过程发生:拨号、通话、回应、挂机,如下所示:

image

 

下面是具体代码实现:

/**
 * 类描述:
 *
 * @author:tangniannian
 * @date:2016/12/5
 * @修改描述:
 * @modifier ${tags}
 */
public interface IPhone {

    void dial(String phoneNum);

    void chat(Object o);

    void hangup();
}

上面的代码看起来没有问题,但是单一职责原则要求一个接口或者类只有一个原因引起变化,也就是说一个接口或者类只有一个职责,它就负责一件事,上面的接口显然并不是只负责一件事情。
IPone这个接口可不只是有一个职责,它包含了两个职责:一个是协议管理,一个是数据送达。dial()和hangup()两个方法实现的是协议管理,分别负责拨号和挂机;chat()是实现数据送达。
下面分析上面存在的问题。第一,协议变化显然会造成接口或者类引起变化;第二,数据传送也会造成接口或者类引起变化。
分析发现,上面的接口包含了两个职责,而且两个职责互不影响,所以考虑拆分为两个接口。如下图所示:

image

 

// 代码描述

public interface IDataTransfer {

    void chat(IConnectionManager iConnectionManager);
}
public interface IConnectionManager {

    void dial(String phoneNum);

    void hangup();
}
/**
 * 类描述:电话具有拨打电话、挂断电话、通话的功能
 *
 * @修改描述:
 * @modifier ${tags}
 */
public class Phone implements IConnectionManager, IDataTransfer{


    public void dial(String phoneNum) {

    }

    public void hangup() {

    }

    public void chat(IConnectionManager iConnectionManager) {
        
    }

}

总结 单一职责原则优点

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

分析

对于接口,我们在设计的时候一定要做到单一,但是对于实现类就需要多方面考虑了。生搬硬套单一职责原则会引起类的剧增,给维护带来非常多的麻烦,而且过分细分类的职责也会人为地增加系统的复杂性。本来一个类可以实现的行为硬要拆成两个类,然后再使用聚合或组合的方式耦合在一起,人为制造了系统的复杂性。



作者:我的头好疼
链接:https://www.jianshu.com/p/2400fc6cc1ff
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值