怎么不花錢做網(wǎng)站專業(yè)營銷推廣團(tuán)隊(duì)
設(shè)計(jì)模式原則
設(shè)計(jì)模式示例代碼庫地址:
https://gitee.com/Jasonpupil/designPatterns
接口隔離原則
- 要求程序員盡量將臃腫龐大的接口拆分為更小的和更具體的接口,讓接口中只包含客戶感興趣的方法
- 接口隔離原則的目標(biāo)是降低類或模塊之間的耦合度,提高代碼的可維護(hù)性、可擴(kuò)展性和可測(cè)試性。
- 通過使用多個(gè)專門的接口,我們可以避免類或模塊之間出現(xiàn)不必要的依賴關(guān)系,減少對(duì)無用接口的實(shí)現(xiàn)或調(diào)用,從而降低了修改和維護(hù)的成本。
模式場(chǎng)景:學(xué)校管理系統(tǒng),不同角色的功能
- 接口隔離原則替換前:定義一個(gè)角色接口,包含幾個(gè)功能:成績(jī)查詢、成績(jī)上傳和教師管理,所有角色都實(shí)現(xiàn)了這個(gè)接口,但是不同角色的權(quán)限不同,只能使用對(duì)應(yīng)權(quán)限的功能,比如:學(xué)生只能成績(jī)查詢,而老師就可以成績(jī)查詢和成績(jī)上傳。如果都實(shí)現(xiàn)同一個(gè)接口,還需要進(jìn)行每個(gè)功能進(jìn)行隔離比較麻煩。
- 接口隔離原則替換后:把角色功能接口根據(jù)每個(gè)功能進(jìn)行拆分,角色類實(shí)現(xiàn)對(duì)應(yīng)權(quán)限的功能接口,這樣就簡(jiǎn)化了角色類里實(shí)現(xiàn)功能隔離。
接口隔離原則替換前示例代碼:功能沒有具體實(shí)現(xiàn),主要看邏輯是怎么樣
角色功能接口:
/*** @Description: 角色接口* @Author: pupil* @Date: 2024/06/26 下午 11:29*/
public interface Role {/*** 成績(jī)查詢* @param userId 學(xué)生id* @return*/String scoreInquiry(long userId);/*** 成績(jī)上傳* @param userId 學(xué)生id* @param grades 成績(jī)*/void gradeUpload(long userId, Map<String,Double> grades);/*** 教師管理* @param teacherId 教師id*/void teacherManagement(long teacherId);}
校長(zhǎng)類:
/*** @Description: 校長(zhǎng),功能沒有具體實(shí)現(xiàn)* @Author: pupil* @Date: 2024/06/26 下午 11:30*/
public class Principal implements Role {private Logger logger = LoggerFactory.getLogger(Principal.class);@Overridepublic String scoreInquiry(long userId) {logger.info("學(xué)生{}:成績(jī)是....",userId);return null;}@Overridepublic void gradeUpload(long userId, Map<String, Double> grades) {// 無法實(shí)現(xiàn)該功能}@Overridepublic void teacherManagement(long teacherId) {logger.info("教師{}: 進(jìn)行管理",teacherId);}
}
教師類:
/*** @Description: 教師* @Author: pupil* @Date: 2024/06/26 下午 11:31*/
public class Teacher implements Role {private Logger logger = LoggerFactory.getLogger(Teacher.class);@Overridepublic String scoreInquiry(long userId) {logger.info("學(xué)生{}:成績(jī)是....",userId);return null;}@Overridepublic void gradeUpload(long userId, Map<String, Double> grades) {logger.info("學(xué)生{}:成績(jī)上傳為{}",userId,grades);}@Overridepublic void teacherManagement(long teacherId) {// 無法實(shí)現(xiàn)該功能}
}
學(xué)生類:
/*** @Description: 學(xué)生* @Author: pupil* @Date: 2024/06/26 下午 11:31*/
public class Student implements Role {private Logger logger = LoggerFactory.getLogger(Student.class);@Overridepublic String scoreInquiry(long userId) {logger.info("學(xué)生{}:成績(jī)是....",userId);return null;}@Overridepublic void gradeUpload(long userId, Map<String, Double> grades) {// 無法實(shí)現(xiàn)該功能}@Overridepublic void teacherManagement(long teacherId) {// 無法實(shí)現(xiàn)該功能}
}
接口隔離原則替換后示例代碼:功能沒有具體實(shí)現(xiàn),主要看邏輯是怎么樣
成績(jī)查詢功能接口:
/*** @Description: 成績(jī)查詢功能接口* @Author: pupil* @Date: 2024/06/26 下午 11:56*/
public interface ScoreInquiry {/*** 成績(jī)查詢* @param userId 學(xué)生id* @return*/String scoreInquiry(long userId);
}
成績(jī)上傳功能接口:
/*** @Description: 成績(jī)上傳功能接口* @Author: pupil* @Date: 2024/06/26 下午 11:56*/
public interface GradeUpload {/*** 成績(jī)上傳* @param userId 學(xué)生id* @param grades 成績(jī)*/void gradeUpload(long userId, Map<String,Double> grades);
}
教師管理功能接口:
/*** @Description: 教師管理功能接口* @Author: pupil* @Date: 2024/06/27 上午 12:01*/
public interface TeacherManagement {/*** 教師管理* @param teacherId 教師id*/void teacherManagement(long teacherId);
}
校長(zhǎng)類:
/*** @Description: 校長(zhǎng),功能沒有具體實(shí)現(xiàn)* @Author: pupil* @Date: 2024/06/26 下午 11:30*/
public class Principal implements ScoreInquiry, TeacherManagement {private Logger logger = LoggerFactory.getLogger(Principal.class);@Overridepublic String scoreInquiry(long userId) {logger.info("學(xué)生{}:成績(jī)是....", userId);return null;}@Overridepublic void teacherManagement(long teacherId) {logger.info("教師{}: 進(jìn)行管理", teacherId);}}
教師類:
/*** @Description: 教師,功能沒有具體實(shí)現(xiàn)* @Author: pupil* @Date: 2024/06/26 下午 11:31*/
public class Teacher implements ScoreInquiry, GradeUpload {private Logger logger = LoggerFactory.getLogger(Teacher.class);@Overridepublic String scoreInquiry(long userId) {logger.info("學(xué)生{}:成績(jī)是....",userId);return null;}@Overridepublic void gradeUpload(long userId, Map<String, Double> grades) {logger.info("學(xué)生{}:成績(jī)上傳為{}",userId,grades);}}
學(xué)生類:
/*** @Description: 學(xué)生,功能沒有具體實(shí)現(xiàn)* @Author: pupil* @Date: 2024/06/26 下午 11:31*/
public class Student implements ScoreInquiry {private Logger logger = LoggerFactory.getLogger(Student.class);@Overridepublic String scoreInquiry(long userId) {logger.info("學(xué)生{}:成績(jī)是....",userId);return null;}
}