2016-09-01 2 views
-2

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

  1. класс обертку, который содержит добавить файл и получить методы файла следующим образом
    • общественности static ABCOutputStream addFile (params) - это возвращает расширенный поток вывода (например, ABCOuputStream) - с помощью которого мы можем записать данные
    • public static String [] addFile (byte [] filecontent) - этот метод записывает содержимое файла непосредственно на локальный или удаленной машине
    • public static byte [] getFile (params) - этот метод считывает содержимое с локальной/удаленной машины - и возвращает содержимое файла в виде массива байтов
    • public static ABCInputStream getFile (params) - этот метод возвращает расширенный поток ввода (скажем, ABCInputStream) - и данные будут читать из этого потока

2.ABCInputStream класса - который представляет собой расширенный входной поток

3.ABCOutputStream класс - который представляет собой расширенный поток

выход

Я не уверен в структуре классов-оболочек, которая выполняет все эти действия.

Извините за слишком длинное теоретическое описание. Я готов добавить дополнительную информацию, если это необходимо.

Кто-нибудь, пожалуйста, помогите мне выбрать образец, чтобы улучшить это намного лучше.

+0

Я думаю, было бы хорошо иметь ответы на этот вопрос, а не закрывать его. Благодарю. – YoungHobbit

+0

* "public static String [] addFile (params)' - это возвращает расширенный поток вывода "* Нет, это не так. Он возвращает 'String []', а не 'OutputStream'. – Andreas

+0

* "public static byte [] getFile()' - этот метод считывает содержимое с локальной/удаленной машины - и он возвращает содержимое файла в виде массива байтов "* Какой файл? Он статичен и не принимает никаких параметров. – Andreas

ответ

4

Очевидно: ваш класс обертки должен не указать статические методы. статические - аномалия в хорошем дизайне OO; и их следует использовать с большой осторожностью. Он плотно соединяет любой «клиентский» код непосредственно с вашим классом Wrapper; и это не что-то, что вы навязываете своим «клиентам»!

Вместо этого вы начинаете с определения интерфейса , который обозначает методы, которые вы хотите предоставить пользователям этого кода. Тогда вы можете использовать фабричный шаблон , например, чтобы создать экземпляры этого интерфейса для кода клиента.

В первом подходе: когда вы даете фабрике никаких конкретных параметров, вы получаете реализацию своего интерфейса, который записывается в локальную файловую систему. Но если вы предоставляете (например!) IP-адрес и учетные данные; то ваша фабрика дает вам «удаленную» реализацию вашего интерфейса.

С другой стороны, у вас могут быть свои «собственные» классы In/OutputStream ... внутри. Если эти потоки не предлагают другой интерфейс, нет необходимости в разоблачить своим клиентам, что они имеют дело с «расширенными» потоками. Иначе.

Краткая история: хороший дизайн OO «меньше» о «узорах», но подробнее о полезно абстракции.Не подставляйте себя на ту или иную модель; вместо этого взгляните на руководящие принципы, такие как SOLID и попытайтесь найти классы/объекты, которые выполняют именно то, что говорит требование; используя четкие, простые абстракции.

+0

Больше, чем я ожидал GhostCat !! Это помогло ... – lsof

+0

Рад это слышать! Вы очень рады. – GhostCat

+1

@GhostCat полностью согласен с последним параграфом. :) –

Смежные вопросы