2009-04-13 36 views
2

基本上我有一個實體(稱爲Session),它將提供許多不同的服務。用戶可以選擇性地打開或關閉每項服務(登錄或註銷)。我不確定代表這個的最佳設計是什麼。見UML建模提供多種服務的對象的正確方法是什麼?

從編程的用例的角度看,交互與會話實例:

Session session = new Session("1234"); // 1234 is the userid 
session.start(); 

session.serviceSignIn(ServiceType.DELICIOUS); 
.... do stuff ... 
session.serviceSignOut(ServiceType.DELICIOUS); 

session.serviceSignIn(ServiceType.MAGNOLIA); 
.... do stuff ... 
session.serviceSignOut(ServiceType.MAGNOLIA); 

另一種可能的設計:

session.delicious().signIn(); 
.... do stuff ... 
session.delicious().signOut(); 

session.magnolia().signIn(); 
.... do stuff ... 
session.magnolia().signOut(); 

我應該更喜歡哪個?我犯了什麼錯誤?

回答

1

爲什麼明確命名服務?據推測這將被掛鉤到一些GUI或其他界面是否正確?可能足以通過諸如「美味」之類的字符串來引用它們。另外爲什麼不讓每個服務都可以自我簽名?

interface Service { 
    String getName(); 
    void signin(); 
    void signout(); 
    State getState(); // state could be signed in signed out or signing in perhaps 
} 

class Services { 
    void addService(Service service); 
    void removeService(Service service); 
    Service getService(String serviceName); 

    ... 
} 

您還應該使Service接口具有用於處理服務的操作,例如添加書籤。

0

我認爲,第一種方法並不是以任何方式將設計捆綁在一起。您可以動態加載服務,並且將來可以輕鬆添加新服務(因爲沒有代碼綁定到確切的服務類型 - 就像在第二種方法中一樣)。

0

我認爲做出這個決定的驅動因素應該是由美味和木蘭提供的實際服務。他們是同樣的服務嗎?如果他們共同擁有的唯一一件事是簽名/註銷行爲,那麼我會採用第二種方法,可能會使用signin/signout功能作爲某種界面/混搭。

+0

它們提供規範的相同類型的服務,但實現完全不同。用戶可以擁有零個或更多的「帳戶」與每個服務。 – 2009-04-13 09:36:23

0

對我來說,它看起來像一個經典的Facade模式,你談論的服務是SOA的實現?也許看看Service Facade。我將使用一個單一的入口點,正如您所描述的(Facade)使用驅動Factory的參數來返回特定的實現。以下示例將允許您添加其他服務而不更改實現。

interface ISessionFacade 
{ 
    void ServicesSignIn(string serviceType); 

    void ServiesSignOut(string serviceType); 
} 

interface ISessionService 
{ 
    void ServicesSignIn(); 

    void ServiesSignOut(); 
} 

class ServiceFactory 
{ 
    public static ISessionService CreateService(string serviceType) 
    { 
     ISessionService sessionService = null; 

     // TODO: Configuration lookup of serviceType, returning a fully qualified class name to load 

     // TODO: Dynamically load class, perhaps this should be a singleton? 

     return sessionService; 
    } 
} 

class Session : ISessionFacade 
{ 
    public void ServicesSignIn(string serviceType) 
    { 
     ISessionService serviceSession = ServiceFactory.CreateService(serviceType); 
     serviceSession.ServicesSignIn(); 
    } 

    public void ServiesSignOut(string serviceType) 
    { 
     ISessionService serviceSession = ServiceFactory.CreateService(serviceType); 
     serviceSession.ServiesSignOut(); 
    } 
} 
+0

考慮到問這個問題的人甚至沒有很好的面向對象設計,這似乎有點矯枉過正。如果你要走這條路線,爲什麼不讓Session成爲一個接口並使用工廠來獲得實現。 – 2009-04-13 18:13:52

+0

如果你到處都沒有大量不必要的空行,你的代碼就不需要滾動框。 – Benson 2009-04-13 18:27:09

相關問題