2011-09-06 3 views
0

필자는 제공자의 기능을 시스템의 위 서비스 계층에 노출시키는 클래스를 가지고 있습니다. GetX()와 같은 공용 메소드가 있습니다. 자, X를 얻는 두 가지 방법이 있습니다 : XML 방식과 비 XML 방식. 두 개의 "라이브러리"클래스는 각각에 대해 하나씩이 두 가지 방법을 구현합니다. 다음과 같이 따라서, 발생하는 구조는 무언가이다 : 그래서"Dumb"래퍼 클래스

public class Provider 
{ 
    private XmlLib _xmlLib; 
    private NonXmlLib _nonXmlLib; 

    public X GetX(// parameters) 
    { 
     // validate the parameters 
     if (// some condition) 
     X = _xmlLib.GetX(); 
     else 
     X = _nonXmlLib.GetX(); 
     return X; 
    } 

    // several other such methods 
} 

internal class XmlLib 
{ 
    public X GetX() 
    { 
     // Xml way to get X. 
    } 

    // several such things to get/send in XML way. 
} 

internal class NonXmlLib 
{ 
    public X GetX() 
    { 
     // NonXml way to get X. 
    } 

    // several such methods to get/send thing in non-XML way. 
} 

그 같은 Provider 클래스 만 인수의 유효성을 검사 한 조건에 따라 바보 래퍼, 일종의되고있는 lib 디렉토리를 결정 요구. 좋은 구현입니까? 이것을 구현하는 더 좋은 방법은 무엇입니까?

답변

1

GetX 메서드를 인터페이스에 두자. 그 시점부터 인터페이스를 구현하는 클래스를 원하는만큼 가질 수 있습니다.

public interface ISomeInterface { X GetX(); } 

이제 (당신이 그것을 모르는 경우 그것에 대해 읽기) 공장 디자인 패턴을 구현하는 클래스를 만들고이 클래스에 위의 인터페이스를 구현하는 어떤 클래스 결정을 가능하게하는 조건을 받아 들일 수 있도록 반환.

public class XmlWay : ISomeInterface 
{ 
    public X GetX() 
    { 
     //your implementation 
    } 
} 

public class NonXmlWay : ISomeInterface 
{ 
    public X GetX() 
    { 
     // Another implementation 
    } 
} 

을 마지막으로 공장 클래스

public class MyXFactory 
{ 
public static ISomeInterface GetXImplementation(bool someCondition) 
{ 
if (someCondition) 
return new XmlWay(); 
else 
return new NonXmlWay(); 
} 

이제 코드가 어떻게 보이는지 elegent 참조 :

는 여기에 내가 코드를 통해 말한이 도움이

ISomeInterface xGen = MyXFactory.GetXImplementation(true); 
xGen.GetX(); 

희망을.