JAVA【设计模式】单一职责原则
一、设计模式的规范
设计模式遵循六⼤原则;单⼀职责( ⼀个类和⽅法只做⼀件事 )、⾥⽒替换( 多态,⼦类可扩展⽗类 )、依赖
倒置( 细节依赖抽象,下层依赖上层 )、接⼝隔离( 建⽴单⼀接⼝ )、迪⽶特原则( 最少知道,降低耦合 )、开闭
原则( 抽象架构,扩展实现 ),会在具体的设计模式章节中,进⾏体现。
二、单⼀职责
定义:一个类只有一个发生变化的原因
三、示例
模拟场景:不同等级的用户可以看到不同格式的视频,vip用户可以看到1080p视频,而访客用户只能看480p视频
未有单一职责原则的设计(传统设计):
package com.qf.principle.single.trandition;
public class VideoUserService {
/**
* 缺点:随着用户类型的增多,代码会出现多个else if的判断,代码变得非常的冗余难以维护
* @param userType
*/
public void serviceGrade(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视频");
}
}
}
package com.qf.principle.single.trandition;
public class ApiTest {
public static void main(String[] args) {
VideoUserService videoUserService=new VideoUserService();
videoUserService.serviceGrade("VIP用户");
videoUserService.serviceGrade("普通用户");
videoUserService.serviceGrade("访客用户");
}
}
总结:违背了开背原则,对扩展开放对修改关闭。随着用户类型的增多,代码会出现多个else if的判断,代码变得非常的冗余难以维护。
单一职责原则设计:
定义接口:IVideoUserService
,方法:definition
,advertisement
package com.qf.principle.single.design;
public interface IVideoUserService {
/**
* 用户的定义
*/
void definition();
/**
* 是否需要看广告
*/
void advertisement();
}
package com.qf.principle.single.design.impl;
import com.qf.principle.single.design.IVideoUserService;
/**
* 访客用户
*/
public class GuestVideoUserService implements IVideoUserService {
@Override
public void definition() {
System.out.println("访客用户 480P视频");
}
@Override
public void advertisement() {
System.out.println("需要看广告");
}
}
package com.qf.principle.single.design.impl;
import com.qf.principle.single.design.IVideoUserService;
/**
* 普通用户
*/
public class OrdinaryVideoUserService implements IVideoUserService {
@Override
public void definition() {
System.out.println("普通用户 720P视频");
}
@Override
public void advertisement() {
System.out.println("无需看广告");
}
}
package com.qf.principle.single.design.impl;
import com.qf.principle.single.design.IVideoUserService;
/**
* vip用户
*/
public class VIPVideoUserService implements IVideoUserService {
@Override
public void definition() {
System.out.println("VIP用户 1080P视频");
}
@Override
public void advertisement() {
System.out.println("无需看广告");
}
}
package com.qf.principle.single.design;
import com.qf.principle.single.design.impl.GuestVideoUserService;
import com.qf.principle.single.design.impl.OrdinaryVideoUserService;
import com.qf.principle.single.design.impl.VIPVideoUserService;
public class ApiTest {
public static void main(String[] args) {
//vip用户
IVideoUserService vipVideoUser=new VIPVideoUserService();
vipVideoUser.advertisement();
vipVideoUser.definition();
//普通用户
IVideoUserService ordinaryUser=new OrdinaryVideoUserService();
ordinaryUser.advertisement();
ordinaryUser.definition();
//访客用户
IVideoUserService guestUser=new GuestVideoUserService();
guestUser.advertisement();
guestUser.definition();
}
}
关系图
总结:利用多态的特性,每新增一个用户类型只需要,多创建一个用户类,去实现接口,这样保证了代码的扩展性和可维护,可读性。