定义:又称为单一功能原则,是面向对象的五个基本原则之一。它规定一个类应该只有一个发生变化的原因,如果需要开发的一个功能需求不是一次性的,且随着业务的发展不断变化而变化,那么当一个class类负责超过两个以上的职责时,就在需求不断迭代下,就会出现难以维护、不好扩展、测试难度加大和上限风险高等问题
所谓的职责就是指类变化的原因,也就是业务需求。
代码实现:
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高清");
}
}
/**
* 如上实现的代码逻辑非常的简单 ,暂时也不会出现什么问题,但是这一个类里面包含着多个不同的行为,也就是用户的等多种职责。如果在这样的类上继续扩展功能或添加逻辑就会显得非常的臃肿
*/
public static void main(String[] args) {
VideoUserService service = new VideoUserService();
service.serveGrade("VIP会员");
service.serveGrade("普通会员");
service.serveGrade("访客用户");
}
/**
*上面的实现方式是在一个if else中实现的,所以在调用方法的时候是所有的职责用户都使用一个方法实现,作为程序的调用入口
* 对于简单的或者几乎不需要迭代的功能这种实现也未尝不可。
* 但是如果面对的是频繁跌单的业务需求,这样的代码就很难支撑系统的迭代。每一次的需求的实现都可能会影响其他的逻辑,给整个接口服务带来不可控制的风险
*/
}
public interface IVideoUserService {
//视屏清晰级别 480 720 1080
void definition();
//广告的播放方式:有广告 无广告
void advertisement();
/**
* 定义出一个上层的接口,统一定义需要实现的功能,包括视屏的清晰度接口 广告播放方式的接口
* 三种用户就可以分别实现自己的服务类,做到职责的统一
*/
public class DanyiTest {
public static void main(String[] args) {
/**
* 利用单一原则优化后的代码,现在每个类都只负责自己的用户的行为,后续如果无论扩展新 的功能呢还是需要在某个时刻修改用户的某个行为,都可以非常方便的开发
* 在项目的开发中尽可能的保证接口的定义、类的实现与以及方法的开发保持单一职责。
*/
//访客用户
GuestVideoUserService guestVideoUserService = new GuestVideoUserService();
guestVideoUserService.definition();
guestVideoUserService.advertisement();
//普通会员
OrdinaryVideoUserService ordinary = new OrdinaryVideoUserService();
ordinary.advertisement();
ordinary.definition();
//vip用户
VipVideoUserService vip = new VipVideoUserService();
vip.advertisement();
vip.definition();
vip.danmu();
}
}
public class GuestVideoUserService implements IVideoUserService {
@Override
public void definition() {
System.out.println("访客用户 视屏的清晰度为480p");
}
@Override
public void advertisement() {
System.out.println("访客用户,视屏有广告");
}
}
public class OrdinaryVideoUserService 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用户 无广告");
}
public void danmu(){
System.out.println("这个是VIP用户自己特有的功能,发送弹幕");
}
/**
*
* 综上 每种用户对应的服务队友对应的类的实现,互相不会干扰,当某一类用户需要添加新的运营规则时操作起来也非常方便
*/
}