面向介面程式設計

2021-08-29 17:36:19 字數 1492 閱讀 7389

在前面的章節中,我們提到乙個介面設計的例子。為什麼我們提倡介面的設計呢?martin fowler在他的分析模式一書中指出,分析問題應該站在概念的層次上,而不是站在實現的層次上。什麼叫做概念的層次呢?簡單的說就是分析物件該做什麼,而不是分析物件怎麼做。前者屬於分析的階段,後者屬於設計甚至是實現的階段。在需求工程中有一種稱為crc卡片的玩藝兒,是用來分析類的職責和關係的,其實那種方法就是從概念層次上進行物件導向設計。因此,如果要從概念層次上進行分析,這就要求你從領域專家的角度來看待程式是如何表示現實世界中的概念的。下面的這句話有些拗口,從實現的角度上來說,概念層次對應於合同,合同的實現形式包括介面和基類。簡單的說吧,在概念層次上進行分析就是設計出介面(或是基類),而不用關心具體的介面實現(實現推遲到子類再實現)。結合上面的論述,我們也可以這樣推斷,介面應該是要符合現實世界的觀念的。

在martin fowler的另一篇著作中提到了這樣乙個例子,非常好的解釋了介面程式設計的思路:

inte***ce person

inte***ce engineer extends person

inte***ce salesman extends person

inte***ce manager extends person

可以看到,為了表示現實世界中人(這裡其實指的是員工的概念)、工程師、銷售員、經理的概念,**根據人的自然觀點設計了繼承層次結構,並很好的實現了重用。而且,我們可以認定該介面是相對穩定的。我們再來看看實現部分:

public class personimpflag implements person, salesman, engineer,manager;

public void makesalesman () ;

public boolean issalesman () ;

public void numberofsales (int value);

public int numberofsales () ;

private void requireissalesman () ;

private int _numberofsales;

private int _jobtitle;

}這是其中一種被稱為內部標示(internal flag)的實現方法。這裡我們只是舉出乙個例子,實際上我們還有非常多的解決方法,但我們並不關心。因為只要介面足夠穩定,內部實現發生再大的變化都是允許的。如果對實現的方式感興趣,可以參考matrin fowler的角色建模的文章或是我在閱讀這篇文章的一篇筆記。

通過上面的例子,我們可以了解到,介面和實現分離的最大好處就是能夠在客戶端未知的情況下修改實現**。這個特性對於分層技術是非常適用的。一種是用在層和層之間的呼叫。層和層之間是最忌諱耦合度過高或是改變過於頻繁的。設計優秀的介面能夠解決這個問題。另一種是用在那些不穩定的部分上。如果某些需求的變化性很大,那麼定義介面也是一種解決之道。舉個不恰當的例子,設計良好的介面就像是我們日常使用的萬用插座一樣,不論插頭如何變化,都可以使用。

最後強調一點,良好的介面定義一定是來自於需求的,它絕對不是程式設計師絞盡腦汁想出來的。

面向介面程式設計

面向介面程式設計 英文的定義是 program to an inte ce,not an implementation 它是物件導向程式設計裡面的乙個設計原則。所謂原則,就是 你最好按我的樣子來做,實在不行也可以違反 物件導向程式設計有三個主要的特性,即是封裝,多型,繼承。面向介面程式設計是多型特性...

面向介面程式設計

物件導向設計裡有一點大家已基本形成共識,就是面向介面程式設計,我想大多數人對這個是沒有什麼覺得需要懷疑的。問題是在實際的專案開發中我們是怎麼體現的呢?難道就是每乙個實現都提供乙個介面就了事了?反過來說,你有時候有沒有覺得介面是多餘的事?又或者,你僅僅是覺得現在類似spring這樣的框架已習慣用介面這...

面向介面程式設計

上篇我們了解了當依賴注入與面向介面程式設計結合起來,才能真正發揮依賴注入的優勢。這篇我們開始簡單了解一下面向介面程式設計。什麼是面向介面程式設計?乙個類依賴其他類的目的是為了獲取其他類所提供的服務,可能這種服務有多種實現,我們可能需要根據不同的場景使用不同的實現。此時,我們可以使用多型,將同一功能的...