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