2011年4月10日 星期日

Design Principle - Interface Segregation Principle (ISP)

ISP除了有Interface Segregation Principle也就是介面分離原則外,
當然最為大家熟知的就是Internet service provider,也就是網際網路服務提供者,
這裡要介紹的當然不會是後者,而是OO(物件導向)設計原則中的ISP。

所謂的ISP,就是希望programmer在設計介面時,能夠考慮到介面中的方法,是否要放在同一個介面。

請見以下的例子:



你會發現,run和fly方法,其實不適合一起放在IAnimal這個介面中,
雖然chicken會fly也會run,但是dog不會fly,而eagle不會run,
將這兩個方法放在同一個介面的後果就是,
可能實作這個介面的類別,必須實作根本用不到的方法。

也就是說上述的例子,違反了ISP,亦即介面分離原則。

所以在設計介面時,必須思考到一些method是否適合放在同一個介面中。

上述例子的改良如下:


那如果現在我們不是在設計新系統,而是在維護舊有系統,
然後發現有類似IAnimal這樣的介面時,該怎麼辦呢?
這時候可以利用Adapter pattern(轉接器模式)來處理,
避免之後新增的模組得承襲舊有系統的設計,去實作用不著的方法。

例如:


這樣的觀念在Java source code中屢見不鮮,
最明顯的例子就是AWT中的event listener和adapter,
例如MouseListener和MouseAdapter.

以上,就是ISP(Interface Segregation Principle)的介紹。

1 則留言:

  1. 您好

    請問您是看哪一本書學到的這些coding , design pattern的觀念呢?小弟想好好拜讀一番

    回覆刪除