## 接口隔離原則
英文名稱:Interface segregation Principle
先了解接口的分類:
1、**實例接口**(Object Interface):java中聲明一個類,使用new關鍵字產生一個實例,它是一個類型的事物的描述這是一種接口。
例如 Person p = new Person();創建了一個對象p,Person類就是p的接口。
2、**類接口**(Class Interface)java中使用interface定義的接口。
定義一:客戶端不應該依賴它不需要的接口。
定義二:類間的依賴關系應該建立在最小的接口上。
我的理解:定義接口時,要盡量將接口細化,按照類別的不同建立不同的接口類型。一個接口中要避免沒有共享方法的類。
**一個例子**:
星探發現美女。
1、定義一個AbstractSearcher抽象類,定義AbstractSearcher()方法和show方法,
2、星探類Searcher類,繼承抽象類。
3、IPettyGirl接口,定義美女的規范。void goodLook(),niceFigure(),greatTemperament().
4,美女類實現IPettyGirl接口。

~~~
<span style="font-size:18px;">public class ISPTest {
public static void main(String[] args) {
Researcher r = new Researcher("lzl");
r.show();
r.AbstractSearch(new Girl("xy"));
}
}
abstract class AbstractSearcher{
public abstract void AbstractSearch(IPettyGirl pettyGirl);
public abstract void show();
}
class Researcher extends AbstractSearcher{
private String name;
public Researcher(String name) {
this.name = name;
}
@Override
public void AbstractSearch(IPettyGirl pettyGirl) {
pettyGirl.goodLook();
pettyGirl.greatTemperament();
pettyGirl.niceFigure();
}
@Override
public void show() {
System.out.println(this.name+":星探展示發現美女....");
}
}
interface IPettyGirl{
public void goodLook();
public void niceFigure();
public void greatTemperament();
}
class Girl implements IPettyGirl{
private String name;
public Girl(String name) {
this.name = name;
}
@Override
public void goodLook() {
// TODO Auto-generated method stub
System.out.println(this.name+"很好看...");
}
@Override
public void niceFigure() {
// TODO Auto-generated method stub
System.out.println(this.name+"身材很棒!");
}
@Override
public void greatTemperament() {
// TODO Auto-generated method stub
System.out.println(this.name+"很有氣質!");
}
}</span>
~~~
-**--需求變更:**
以上對美女的要求是同時滿足這三個條件,那么現在要求滿足分類:滿足氣質好的屬于內在型美女,滿足身材好和長相好的屬于外在型美女。
此時我們發現定義的IPettyGirl接口中封裝了氣質好的內在型美女,這樣此接口就顯得臃腫了,靈活性不高,可維護性也不好。
解決方案:
將IPettyGirl接口劃分為兩個接口ITemperamentPettyGirl和IGoodBodyGirl.
星探類可以分別發現這兩款美女。

~~~
public class ISPTest2 {
public static void main(String[] args) {
Researcher2 r1 = new Researcher2("lzl");
r1.show();
r1.AbstractSearch((ITemperamentPettyGirl)new Girl2("xy"));
}
}
abstract class AbstractSearcher2{
public abstract void AbstractSearch(ITemperamentPettyGirl temperamentGirl);
public abstract void AbstractSearch(IGoodBodyGirl goodBodyGirl);
public abstract void show();
}
class Researcher2 extends AbstractSearcher2{
private String name;
public Researcher2(String name) {
this.name = name;
}
@Override
public void AbstractSearch(ITemperamentPettyGirl temperamentGirl) {
temperamentGirl.greatTemperament();
}
@Override
public void AbstractSearch(IGoodBodyGirl goodBodyGirl) {
// TODO Auto-generated method stub
goodBodyGirl.goodLook();
goodBodyGirl.niceFigure();
}
@Override
public void show() {
// TODO Auto-generated method stub
System.out.println(this.name+"星探發現美女...");
}
}
//氣質型美女
interface ITemperamentPettyGirl{
public void greatTemperament();
}
//身材好美女
interface IGoodBodyGirl{
public void goodLook();
public void niceFigure();
}
class Girl2 implements ITemperamentPettyGirl,IGoodBodyGirl{
private String name;
public Girl2(String name) {
this.name = name;
}
@Override
public void goodLook() {
// TODO Auto-generated method stub
System.out.println(this.name+"很好看...");
}
@Override
public void niceFigure() {
// TODO Auto-generated method stub
System.out.println(this.name+"身材很棒!");
}
@Override
public void greatTemperament() {
// TODO Auto-generated method stub
System.out.println(this.name+"很有氣質!");
}
}
~~~
以上把一個臃腫的接口變更為兩個獨立的接口所依賴的原則就是接口隔離原則。
接口是我們設計時對外提供的契約,通過分散定義多個接口,可以預防未來變更的擴散,提高系統的靈活性和可維護性。
接口隔離原則是對接口進行的規范約束,有以下四層含義(摘自《設計模式之禪》)
1、接口要盡量小
接口在遵守單一職責原則的基礎下,盡可能細化接口的方法。并不是無休止的細化接口。
2、接口要高內聚
高內聚是提高接口、類、模塊的處理能力,減少對外的交互。在接口中盡量少公布public方法,接口是對外的承諾,承諾越少對外越有利,變更的風險也就越少,同時有利于降低成本
3、定制服務
根據需求分析,必要時為特殊用戶提供定制的接口,盡量避免不同操作人群使用同一接口,這樣會降低系統的響應速度和擴展性。
4、接口設計是有限度的
根據開發情景來劃分設計接口,在開發過程中設計接口的顆粒度越小,系統靈活性越高。并不是以為的將接口細化。
- 前言
- 6大設計原則(一)---單一職責原則
- 6大設計原則(二)---里氏替換原則
- 6大設計原則(三)---依賴倒置原則
- 6大設計模式(四)----接口隔離原則
- 6大設計原則(五)---迪米特法則
- 6大設計原則(六)---開閉原則。
- 設計模式(一)---單例模式
- 設計模式(二)---工廠方法模式
- 設計模式(三)---抽象工廠模式
- 設計模式(四)---模板方法模式
- 設計模式(五)---建造者模式
- 設計模式(六)---代理模式
- 設計模式(七)---原型模式
- 設計模式(八)---中介者模式
- 設計模式(九)---命令模式
- 設計模式(十)---責任鏈模式
- 設計模式(十一)---裝飾模式
- 設計模式(十二)---策略模式
- 設計模式(十三)---適配器模式
- 設計模式(十四)---迭代器模式
- 設計模式(十五)---組合模式
- 設計模式(十六)---觀察者模式
- 設計模式(十七)---門面模式
- 設計模式(十八)---備忘錄模式
- 設計模式(十八)---訪問者模式
- 設計模式(二十)---狀態模式
- 設計模式(二十二)---享元模式
- 設計模式(二十三)---橋梁模式