2013-07-17 113 views
0

我公司擁有一批肥皂服務器類其中大部分將需要實現3種方法的:模板方法模式是共享Soap方法的最佳解決方案嗎?

ping() // something to bounce a signal off to prove it has been reached 
getCredentials($creds) // credentials to check sets session value 
getCaller() // for logging, uses session value 

因爲它們構成了WSDL的一部分DEFN他們需要的是公衆。

我相當肯定,這(我已經命名它Soaplogin)將需要一個抽象類(因爲它必須永遠對自己被實例化)

然後擴展這個核心的具體類則有自己的自己的方法,沒有一個是共享的。

我在尋找使用的最佳類型的模式,並且有點困惑,儘管我認爲模板方法恰好符合法案 - 但我可以簡單地擴展SoapLogin類。

您可以給我最好的使用模式,也許這個班的首選名稱有什麼建議。

(而這使用ZF1組件它不使用完全成熟的MVC - 的情況下,這是很重要的)

+0

我每次發現有用的東西是包含一種方法來詢問服務器運行的是哪個軟件版本。你的'ping()'函數看起來應該這樣做。 – Sven

+0

也許不正確,我使用ping()來簡單地證明服務是可達的。我測試了wsdl緩存關閉,沒有wsdl?死();但是一旦打開了wsdl緩存,我想不出另一種證明服務已啓動/可達的方式。我想將登錄消息與「生活證明」消息分開。客戶端也記錄了getCredentials響應字符串......但是,我想它可能會返回版本號... – Cups

+0

完全同意。檢查這些基礎知識對於高效調試非常重要,我喜歡你的ping理念。我不確定是否發佈ping的版本信息是否正確,或者是否應該將其放入'getVersionInfo'方法(它也可以充當心跳檢查函數),但我從大量肥皂的使用經驗中得知服務,你真的想知道它的版本容易。 – Sven

回答

0

喜歡組成繼承。

你真正做的是你創建完全獨立的接口,只有偶然碰巧有相同的方法。

好。總是這樣做的泛型方法 - 應該在它自己的類中。但所有這些方法都不是一個類!每種方法一個類!

然後,您可以將所有這些方法類添加到您的服務器類,並以相同的方式添加所有特殊功能。

通過這種方式,您可以以任何方式組合任何通用函數,並在需要時僅向一個API添加另一個函數。

0

這種模式可能是一個很好的解決方案,如果你只是想創建幾個肥皂連接。

另一個可能是使用接口。它會告訴你的程序,每個實現SoapItf的類(例如,如果你想要重命名)都可以執行soap方法。

如果你尋找一個演化的應用程序,也許你需要連接到Rest webservice,這樣你就可以創建一個抽象類Werbservice,兩個類Soap和Rest來擴展它,這兩個類分別實現了SoapItf和RestItf接口。

該方法有助於使用多態性,這是OOP中的一個重要概念。

class diagram

在這種情況下,我可以添加方法肥皂或不改變兩者休息。

之後,如果你有像你的例子中的肥皂特異性,你可以擴展肥皂類。這將更容易發展的應用程序和使用包體系結構(有趣的,如果你使用命名空間)

+0

重複使用這個類的肥皂和休息,從來沒有想到,好想法... – Cups

+0

SOAP和REST是兩個概念可能不真正對齊。思考SOAP工作方式通常會導致設計非常糟糕的REST服務。 – Sven

+0

我沒有說相反的,我只是做了一個設計,調用同一個類Webservice,但是Rest和Soap僅僅爲了語義問題而擴展了這個類。他們不做同樣的事情,這就是爲什麼我們使用不同的界面,但他們都是webservice –

0

在我看來,你可以使用模板模式來管理可在子類中傳播的公共資源。例如,你有一個soaplogin公共抽象類,並且可能有一些資源可以被大多數子類使用。那麼最好在超類中管理該資源,並在子類中傳遞迴調以使用超類的資源。優點是你在一個地方管理資源。

例如,我在我的超類中有一個共同的資源。我可以創建一個回調傳遞資源作爲參數。

interface ResourceCallback { 
    T call(Resource resource); 
} 

然後可以定義等作爲doWithResource(ResourceCallback回調)和所有子類現在可以用自己的實現他們的方法使用資源的超類的抽象方法。