设计模式原则——接口隔离原则

设计模式原则

设计模式示例代码库地址:

https://gitee.com/Jasonpupil/designPatterns

接口隔离原则

  • 要求程序员尽量将臃肿庞大的接口拆分为更小的和更具体的接口,让接口中只包含客户感兴趣的方法
  • 接口隔离原则的目标是降低类或模块之间的耦合度,提高代码的可维护性、可扩展性和可测试性。
  • 通过使用多个专门的接口,我们可以避免类或模块之间出现不必要的依赖关系,减少对无用接口的实现或调用,从而降低了修改和维护的成本。

模式场景:学校管理系统,不同角色的功能

  • 接口隔离原则替换前:定义一个角色接口,包含几个功能:成绩查询、成绩上传和教师管理,所有角色都实现了这个接口,但是不同角色的权限不同,只能使用对应权限的功能,比如:学生只能成绩查询,而老师就可以成绩查询和成绩上传。如果都实现同一个接口,还需要进行每个功能进行隔离比较麻烦。
  • 接口隔离原则替换后:把角色功能接口根据每个功能进行拆分,角色类实现对应权限的功能接口,这样就简化了角色类里实现功能隔离。

接口隔离原则替换前示例代码:功能没有具体实现,主要看逻辑是怎么样

角色功能接口:
java 复制代码
/**
 * @Description: 角色接口
 * @Author: pupil
 * @Date: 2024/06/26 下午 11:29
 */
public interface Role {

    /**
     * 成绩查询
     * @param userId 学生id
     * @return
     */
    String scoreInquiry(long userId);

    /**
     * 成绩上传
     * @param userId 学生id
     * @param grades 成绩
     */
    void gradeUpload(long userId, Map<String,Double> grades);

    /**
     * 教师管理
     * @param teacherId 教师id
     */
    void teacherManagement(long teacherId);

}
校长类:
java 复制代码
/**
 * @Description: 校长,功能没有具体实现
 * @Author: pupil
 * @Date: 2024/06/26 下午 11:30
 */
public class Principal implements Role {

    private Logger logger = LoggerFactory.getLogger(Principal.class);

    @Override
    public String scoreInquiry(long userId) {
        logger.info("学生{}:成绩是....",userId);
        return null;
    }

    @Override
    public void gradeUpload(long userId, Map<String, Double> grades) {
        // 无法实现该功能
    }

    @Override
    public void teacherManagement(long teacherId) {
        logger.info("教师{}: 进行管理",teacherId);
    }
}
教师类:
java 复制代码
/**
 * @Description: 教师
 * @Author: pupil
 * @Date: 2024/06/26 下午 11:31
 */
public class Teacher implements Role {

    private Logger logger = LoggerFactory.getLogger(Teacher.class);

    @Override
    public String scoreInquiry(long userId) {
        logger.info("学生{}:成绩是....",userId);
        return null;
    }

    @Override
    public void gradeUpload(long userId, Map<String, Double> grades) {
        logger.info("学生{}:成绩上传为{}",userId,grades);
    }

    @Override
    public void teacherManagement(long teacherId) {
        // 无法实现该功能
    }
}
学生类:
java 复制代码
/**
 * @Description: 学生
 * @Author: pupil
 * @Date: 2024/06/26 下午 11:31
 */
public class Student implements Role {

    private Logger logger = LoggerFactory.getLogger(Student.class);

    @Override
    public String scoreInquiry(long userId) {
        logger.info("学生{}:成绩是....",userId);
        return null;
    }

    @Override
    public void gradeUpload(long userId, Map<String, Double> grades) {
        // 无法实现该功能
    }

    @Override
    public void teacherManagement(long teacherId) {
        // 无法实现该功能
    }
}

接口隔离原则替换后示例代码:功能没有具体实现,主要看逻辑是怎么样

成绩查询功能接口:
java 复制代码
/**
 * @Description: 成绩查询功能接口
 * @Author: pupil
 * @Date: 2024/06/26 下午 11:56
 */
public interface ScoreInquiry {
    /**
     * 成绩查询
     * @param userId 学生id
     * @return
     */
    String scoreInquiry(long userId);
}
成绩上传功能接口:
java 复制代码
/**
 * @Description: 成绩上传功能接口
 * @Author: pupil
 * @Date: 2024/06/26 下午 11:56
 */
public interface GradeUpload {

    /**
     * 成绩上传
     * @param userId 学生id
     * @param grades 成绩
     */
    void gradeUpload(long userId, Map<String,Double> grades);
}
教师管理功能接口:
java 复制代码
/**
 * @Description: 教师管理功能接口
 * @Author: pupil
 * @Date: 2024/06/27 上午 12:01
 */
public interface TeacherManagement {

    /**
     * 教师管理
     * @param teacherId 教师id
     */
    void teacherManagement(long teacherId);
}
校长类:
java 复制代码
/**
 * @Description: 校长,功能没有具体实现
 * @Author: pupil
 * @Date: 2024/06/26 下午 11:30
 */
public class Principal implements ScoreInquiry, TeacherManagement {

    private Logger logger = LoggerFactory.getLogger(Principal.class);

    @Override
    public String scoreInquiry(long userId) {
        logger.info("学生{}:成绩是....", userId);
        return null;
    }

    @Override
    public void teacherManagement(long teacherId) {
        logger.info("教师{}: 进行管理", teacherId);
    }

}
教师类:
java 复制代码
/**
 * @Description: 教师,功能没有具体实现
 * @Author: pupil
 * @Date: 2024/06/26 下午 11:31
 */
public class Teacher implements ScoreInquiry, GradeUpload {

    private Logger logger = LoggerFactory.getLogger(Teacher.class);


    @Override
    public String scoreInquiry(long userId) {
        logger.info("学生{}:成绩是....",userId);
        return null;
    }

    @Override
    public void gradeUpload(long userId, Map<String, Double> grades) {
        logger.info("学生{}:成绩上传为{}",userId,grades);
    }

}
学生类:
java 复制代码
/**
 * @Description: 学生,功能没有具体实现
 * @Author: pupil
 * @Date: 2024/06/26 下午 11:31
 */
public class Student implements ScoreInquiry {

    private Logger logger = LoggerFactory.getLogger(Student.class);

    @Override
    public String scoreInquiry(long userId) {
        logger.info("学生{}:成绩是....",userId);
        return null;
    }
}

根据接口隔离原则的示例类图:

相关推荐
Bob99981 分钟前
基于晶晨S905L3B单网线盒子的Armbian 或openwrt应用
java·javascript·网络·数据结构·c++·python·eclipse
sukalot18 分钟前
window 显示驱动开发-线程和同步级别为零级
java·开发语言·驱动开发
两点王爷19 分钟前
Java 中的数据结构--简单汇总
java·开发语言·数据结构
子豪-中国机器人20 分钟前
第 14 届蓝桥杯 C++ 青少组省赛中 / 高级组真题解析
java·开发语言·数据结构
加什么瓦33 分钟前
String、StringBuilder、StringBuffer的区别
java·开发语言·jvm
九转苍翎1 小时前
JAVA SE(9)——多态
java
好想像大佬一样能够ak所有1 小时前
蓝桥杯-通电(最小生成树java)
java·数据结构·算法·蓝桥杯
就叫年华吧丶2 小时前
Apache POI实现Excel的基本写入、导出操作
java·maven·apache·excel
今日上上签07072 小时前
《OmniMeetProTrack 全维会议链智能追录系统 软件设计文档》
人工智能·设计模式·aigc·软件工程·团队开发·需求分析·规格说明书