"Тупой" класс Wrapper - PullRequest
       22

"Тупой" класс Wrapper

0 голосов
/ 06 сентября 2011

У меня есть класс, скажем, Provider, который предоставляет свою функциональность вышеуказанным уровням обслуживания системы. У него есть публичный метод, скажем, GetX (). Теперь есть два способа получить X: XML и не XML. Два «библиотечных» класса реализуют эти два способа, по одному для каждого. Таким образом, структура, которая происходит, выглядит следующим образом:

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 становится своего рода тупой оберткой, которая проверяет только аргументы и на основе одного условия решает, какую библиотеку вызывать. Это хорошая реализация? Есть ли лучший способ реализовать это?

1 Ответ

1 голос
/ 06 сентября 2011

Пусть метод 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();
}

Теперь посмотрим, как будет выглядеть ваш код:

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

Надеюсь, это поможет.

...