Шаблон проектирования для сохранения / загрузки объекта в различном формате - PullRequest
4 голосов
/ 05 декабря 2011

У меня есть объект: X, который можно сохранить или загрузить в различных форматах: TXT, PDF, HTML и т. Д.

Как лучше всего справиться с этой ситуацией? Добавить пару методов к X для каждого формата, создать новый класс для каждого формата или существует (как я полагаю) лучшее решение?

Ответы [ 5 ]

3 голосов
/ 05 декабря 2011

Я бы выбрал шаблон стратегии.Например:

interface XStartegy {
    X load();
    void save(X x);
}

class TxtStrategy implements XStartegy {
    //...implementation...
}

class PdfStrategy implements XStartegy {
    //...implementation...
}

class HtmlStrategy implements XStartegy {
    //...implementation...
}

class XContext {
    private XStartegy strategy;

    public XContext(XStartegy strategy) {
        this.strategy = strategy;
    }

    public X load() {
        return strategy.load();
    }

    public void save(X x) {
        strategy.save(x);
    }
}
1 голос
/ 05 декабря 2011

Я согласен с @DarthVader, хотя в Java лучше написать

public class XDocument implements IDocument { ...

Вы также можете использовать абстрактный класс, если для документов много общего, а в общих методах базового класса вызывать абстрактный save(), который реализован только в подклассах.

0 голосов
/ 05 декабря 2011

Я бы вместо этого предложил шаблон Стратегии.Вы всегда сохраняете и восстанавливаете, разница только в том, как вы это делаете (ваша стратегия).Таким образом, у вас есть методы save() и restore(), которые относятся к различным FormatStrategy объектам, которые вы можете подключить и использовать во время выполнения.

0 голосов
/ 05 декабря 2011

Это зависит от ваших объектов, но возможно, что шаблон посетителя (http://en.wikipedia.org/wiki/Visitor_pattern) может быть использован здесь. Есть разные посетители (PDFVisitor, HHTMLVisitor и т. Д.), Которые знают, как сериализовать части ваших объектов, которые они посещают.

0 голосов
/ 05 декабря 2011

Я бы пошел с фабричным рисунком.Похоже, вы можете использовать наследование / полиморфизм с дженериками.Вы даже можете сделать внедрение зависимостей, если будете использовать аналогичный дизайн следующим образом.

public interface IDocument
{
   void Save();
}

public class Document : IDocument
{


}

public class PdfDocument: IDocument
{
   public void Save(){//...}
}

public class TxtDocument: IDocument
{
   public void Save(){//...}
}

public class HtmlDocument : IDocument
{
  public void Save(){//...}
}

, тогда в другом классе вы можете сделать это:

public void SaveDocument(T document) where T : IDocument
{
   document.save();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...