一、ISP簡介(ISP--Interface Segregation PRinciple):
使用多個專門的接口比使用單一的總接口要好。
一個類對另外一個類的依賴性應當是建立在最小的接口上的。
一個接口代表一個角色,不應當將不同的角色都交給一個接口。沒有關系的接口合并在一起,形成一個臃腫的大接口,這是對角色和接口的污染。
“不應該強迫客戶依賴于它們不用的方法。接口屬于客戶,不屬于它所在的類層次結構。”這個說得很明白了,再通俗點說,不要強迫客戶使用它們不用的方法,如果強迫用戶使用它們不使用的方法,那么這些客戶就會面臨由于這些不使用的方法的改變所帶來的改變。
二、舉例說明:
使用場合,提供調用者需要的方法,屏蔽不需要的方法.滿足接口隔離原則.比如說電子商務的系統,有訂單這個類,有三個地方會使用到,
一個是門戶,只能有查詢方法,
一個是外部系統,有添加訂單的方法,
一個是管理后臺,添加刪除修改查詢都要用到.
根據接口隔離原則(ISP),一個類對另外一個類的依賴性應當是建立在最小的接口上.
也就是說,對于門戶,它只能依賴有一個查詢方法的接口.
下面是實現的代碼.
//--這兒不用接口繼承,因為可能出現修改了父接口影響了子接口
interface IOrderForPortal{
String getOrder();
}
interface IOrderForOtherSys{
String insertOrder();
String getOrder();
}
interface IOrderForAdmin{ //extendsIOrderForPortal,IOrderForOtherSys
String deleteOrder();
String updateOrder();
String insertOrder();
String getOrder();
}
/*
interface IOrderForPortal{
String getOrder();
}
interface IOrderForOtherSys{
String insertOrder();
}
interface IOrderForAdmin extendsIOrderForPortal,IOrderForOtherSys{
String updateOrder();
String deleteOrder();
}
*/
class Order implementsIOrderForPortal,IOrderForOtherSys,IOrderForAdmin{
private Order(){
//--什么都不干,就是為了不讓直接 new,防止客戶端直接New,然后訪問它不需要的方法.
}
//返回給Portal
return (IOrderForPortal)new Order();
}
//返回給OtherSys
public static IOrderForOtherSys getOrderForOtherSys(){
return (IOrderForOtherSys)neWorder();
}
//返回給Admin
public static IOrderForAdmin getOrderForAdmin(){
return (IOrderForAdmin)new Order();
}
//--下面是接口方法的實現.只是返回了一個String用于演示
public String getOrder(){
return "implemented getOrder";
}
public String insertOrder(){
return implementedinsertOrder";
}
public String updateOrder(){
return "implementedupdateOrder";
}
public String deleteOrder(){
return "implementeddeleteOrder";
}
}
public clss TestCreateLimit{
public static void main(String[] args){
IOrderForPortal orderForPortal =Order.getOrderForPortal();
IOrderForOtherSys orderForOtherSys =Order.getOrderForOtherSys();
IOrderForAdmin orderForAdmin = Order.getOrderForAdmin();
System.out.println("Portal門戶調用方法:"+orderForPortal.getOrder());
System.out.println("OtherSys外部系統調用方法:"+orderForOtherSys.insertOrder());
System.out.println("Admin管理后臺調用方法:"+orderForAdmin.getOrder()+";"+orderForAdmin.insertOrder()+";"+orderForAdmin.updateOrder()+";"+orderForAdmin.deleteOrder());
}
}
這樣就能很好的滿足接口隔離原則了,調用者只能訪問它自己的方法,不能訪問到不應該訪問的方法.
歡迎討論...寫這些的目的就是為了共同進步,有什么錯誤或者不足,歡迎指出....
新聞熱點
疑難解答