单一职责原则

  单一职责又称单一功能原则,规定一个类应该只有一个发生变化的原因。职责指发生变化的原因,如果一个类有多个原因引起变化,那么后续迭代维护和拓展可能会带来很多麻烦。

以视频网站用户分类为例

简单地假设某个视频网站的用户分为访客用户、普通会员、VIP会员三类。
访客:只能观看480P高清,有广告;普通会员:可以观看720P超清,有广告;VIP会员:可以观看1080P蓝光,无广告。

  简单地直接实现的方式:

public class VideoUserService {

    public void serverGrade(String userType){
        if("VIP会员".equals(userType)){
            System.out.println("1080P蓝光");
        }
        else if("普通会员".equals(userType)){
            System.out.println("720P超清");
        }
        else if ("访客用户".equals(userType)){
            System.out.println("480P高清");
        }
    }
}

  直接看上去好像没什么问题,但是这里的代码是简单的情况,如果考虑到复杂的业务逻辑,需要频繁迭代更新维护的话,那么就会麻烦很多。首先,如果用户类型很多的话,修改某类型用户的逻辑需要从长串的代码中找到对应的if分支然后修改。然后,如果整个系统要加上某个功能的话,每个if分支中需要加上自己特有的逻辑,出错的概率大大增加。
  使用单一职责原则进行改造的话,需要将功能抽象出来作为接口,然后为不同类型的用户创建不同的类,实现接口的抽象方法。这样一来。将不同类型的用户拆分到不同的类中,每个类只关心实现具体的类型用户的功能,当业务逻辑复杂的时候能减小代码的复杂度,提升可读性,更重要的是在修改代码的时候只会修改当前类的逻辑,不会影响到其他类型的逻辑,减少了代码修改的风险。

使用单一职责改造

public interface IVideoUserService {
    void definition();

    void advertisement();
}
public class GuestVideoUserService implements IVideoUserService{
    @Override
    public void definition() {
        System.out.println("访客用户,480P高清");
    }

    @Override
    public void advertisement() {
        System.out.println("访客用户,视频有广告");
    }
}

public class OrdinaryVedioUserService implements IVideoUserService{
    @Override
    public void definition() {
        System.out.println("普通会员,720P超清");
    }

    @Override
    public void advertisement() {
        System.out.println("普通会员,视频有广告");
    }
}

public class VipVideoUserService implements IVideoUserService{
    @Override
    public void definition() {
        System.out.println("VIP会员,1080P蓝光");
    }

    @Override
    public void advertisement() {
        System.out.println("VIP会员,视频去广告");
    }
}

总结:单一职责的优点在于降低单个类的代码复杂度,提升可读性,降低代码维护出现问题的风险。


参考资料:《重学Java设计模式》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值