目录
1.概述
单一职责原则(Single Responsibility Principle,SRP)又称单一功能原则,是面向对象的五个基本原则(SOLID)之一。它规定一个类应该只有一个发生变化的原因,该原则由罗伯特.C.马丁(Robert C.Martin)在《敏捷软件开发:原则,模式与实践》一书中提出。
2.业务场景
当在各类视频网站看电影,电视剧时,网站针对不同的用户类型,会在用户观看时给出不同的用户反馈:
1.访客用户,一般只可以观看480P视频,并时刻提醒用户注册会员。这表示视频业务发展需要拉客,以获取更多的新注册用户。
2.普通会员,可以观看720超清视频,但不能屏蔽视频中出现的广告。这表示视频业务发展需要盈利。
3.VIP会员(属于付费用户),既可以观看1080P蓝光视频,又可以关闭或跳过广告。
3.运用设计原则前代码实现
3.1.代码实现
VideoUserService.java
package chapter02.srp;
public class VideoUserService {
public void serveGrade(String userType){
if("VIP会员".equals(userType)){
System.out.println("VIP会员,视频1080P蓝光");
}else if("普通会员".equals(userType)){
System.out.println("普通会员,视频720P超清");
}else if("访客用户".equals(userType)){
System.out.println("访客用户,视频480P高清");
}
}
}
测试用例
@Test
public void test_serveGrade(){
VideoUserService service = new VideoUserService();
service.serveGrade("VIP会员");
service.serveGrade("普通会员");
service.serveGrade("访客用户");
}
3.2.总结
1.对于简单的或者几乎不需要迭代的功能,这种实现也未尝不可。但如果面对频繁迭代的业务需求,这样的代码结构就很难支撑系统迭代,每一次需求的实现都可能会影响到其他逻辑,给整个接口服务带来不可控的风险。
4.运用设计原则后代码实现
4.1.代码实现
IVideoUserService.java
package chapter02.srp.design;
public interface IVideoUserService {
//视频清晰级别:480P,720P,1080P
void definition();
//广告播放方式:无广告,有广告
void advertisement();
}
GuestVideoUserService.java
package chapter02.srp.design;
public class GuestVideoUserService implements IVideoUserService {
@Override
public void definition() {
System.out.println("访客用户,480高清视频");
}
@Override
public void advertisement() {
System.out.println("访客用户,视频有广告");
}
}
OrdinaryVideoUserService.java
package chapter02.srp.design;
public class OrdinaryVideoUserService implements IVideoUserService {
@Override
public void definition() {
System.out.println("普通会员,720超清视频");
}
@Override
public void advertisement() {
System.out.println("普通会员,视频有广告");
}
}
VipVideoUserService.java
package chapter02.srp.design;
public class VipVideoUserService implements IVideoUserService {
@Override
public void definition() {
System.out.println("VIP会员,1080蓝光视频");
}
@Override
public void advertisement() {
System.out.println("VIP会员,视频无广告");
}
}
测试用例
@Test
public void test_VideoUserService(){
//访客用户
IVideoUserService guest = new GuestVideoUserService();
guest.definition();
guest.advertisement();
//普通会员
IVideoUserService ordinary = new OrdinaryVideoUserService();
ordinary.definition();
ordinary.advertisement();
//VIP会员
IVideoUserService vip = new VipVideoUserService();
vip.definition();
vip.advertisement();
}
4.2.总结
1.每种用户对应的服务职责都有对应的类实现,不会互相干扰。当某一类用户需要添加新的运营规则是,操作起来也非常方便。
2.利用单一职责原则的代码优化后,现在每个类都只负责自己的用户行为。后续无论扩展新的功能还是需要在某个时刻修改某个用户行为类,都可以非常方便地开发和维护。
3.在项目开发的过程中,尽可能保证接口的定义,类的实现以及方法开发保持单一职责,对项目后期的迭代和维护会有很大的帮助。