2012-01-17 3 views
1

Я wrting то, что посмотреть, как это (конечно же его немного более сложным, чем этот образец):"Inject" интерфейс implementions в класс в Java

public class DoOnAll { 

    private List<IActionPerformer> actionPerformers; 

    public DoOnAll(List<IActionPerformer> actionPerformers) { 
     this.actionPerformers = actionPerformers; 
    } 

    public void callFromSomeWhere(String path) { 
     File f = new File(path); 
     List<File> list = Arrays.asList(f.listFiles()); 
     for (File file : list) { 
      for (IActionPerformer action : actionPerformers) { 
       action.perform(file); 
       } 
     } 
    } 

} 

public interface IActionPerformer { 
    public void perform(File file); 
} 

public class SomePerformer implements IActionPerformer { 

    public void perform(File file) { 
     if (getFileType(file) = ".txt") { 
      doSomething 
     } 
    } 
} 

у меня 2 вопроса:

  1. Должен ли я переместить условие в SomePerformer на другой метод, например boolean accept(File file), а также добавить этот метод в интерфейс? Если да, как бы я «собирал» все принятые классы в DoOnAll? просто перейдите в список actionPerformers и добавьте все accepeted в другой список, а затем перейдите по списку принятых и .perform на них? Или есть другой способ, который обычно используется в методологии?

  2. Какие существуют способы ввода в список actionPerformrs? Я хочу написать независимые реализации и определить в файле, скажем, файл xml, какие из них ввести в список.

+0

Является ли «TraverseDirecotry» (sic) «DoOnAll»? –

+0

Является ли TraverseDirecotry опечаткой для конструктора DoOnAll? – wmorrison365

+0

Моя ошибка, я отредактировал – AAaa

ответ

5

В ответ на ваш второй вопрос вы должны изучить dependency injection. Java имеет несколько хороших рамок, которые могут сделать это для вас, например:

Spring, в частности, позволяет определить компоненты и зависимости вашего приложения в файлах XML. Примеры см:

Эта последняя ссылка содержит подраздел по инжекции конструктора: создание объектов java с зависимостями, предоставляемыми их конструкторами, как того требует ваш класс DoOnAll.

+0

Можете ли вы добавить простой пример того, как это делается с весной? В частности, как определить класс DoOnAll как тот, который его свойство actionPerformers должно запрашивать у xml для инъекций? Кроме того, я обычно знаю, что весна дала много способностей. Возможно ли, если я использую Spring, чтобы как-то поставить условия внутри xml-файла, скажите, как-то переместить условие на тип файла в xml? – AAaa

+0

@AAaa см. Отредактированный ответ ... –

+0

Что делать, если я хочу, чтобы xml-файл находился за пределами пути к классам? – AAaa

2

Вопрос 1. Что вы описали, это шаблон цепи ответственности. Вы также можете проверить, может ли Исполнитель выполнить в файле, и не использовать следующий исполнитель из списка. Если ничего не осталось - исключение. Вы можете использовать другой метод или сделать свой метод perform возвратом true/false исключения throw, если он не может выполнить.

Вопрос 2. Используйте весну простейшим способом. Сделайте это как:

ApplicationContext context = new ClassPathXmlApplicationContext("some_configuration.xml"); 

Вы также можете попробовать Google Guice.

+2

Не действительно Цепочка ответственности, как в этом шаблоне, первая Объект, на который возложена ответственность, является последним. Вы продолжаете повторять элементы, пока не найдете тот, который способен справиться с ситуацией. Здесь, апеллятору нужен каждый элемент, который может обрабатывать значение для этого. –

+0

Правда. Я забыл об этом. –

2

Общие предложения здесь:

  1. Начало простой (с тем, что у вас есть), а также расширить свой интерфейс, когда у вас есть использование (случай) для него.Я бы просто сделал if (accept(someFile)) perform(someFile); в методе AbstractPerformer.performIfAccepted (File).

  2. Другие ответы, я не эксперт в этой области.

3

Вопрос WRT 2: Я согласен с Дэном, Весной или Гизом.

WRT question 1: IMHO Я бы не создал условный метод как часть интерфейса. В любом случае вы должны вызывать один метод для каждого объекта, зачем звонить два? Пусть объект определит для себя, если обработка должна быть выполнена. Это также предотвращает любые потенциальные накладные расходы при вызове нескольких методов в классе. Это также делает метод вызова более простым.

2

1) Прежде всего, прошу прощения ... Я думаю, вам нужно решить, что именно вы хотите сделать. Следует ли (a) дать первому ответчику возможность ответить на наличие файла определенного типа, (б) разрешить всем возможным ответчикам для ответа этого типа или (c) идентифицировать один конкретный ответчик в файле тип.

Если:

а) См ответ Питера Гвязда (ИМО).

b) Похож на (a), но допускает несколько ответчиков в цепи.

c) Если для типа файла всегда существует конкретный ответчик, вы можете использовать фабрику для получения определенного экземпляра на основе типа файла. Это скрывает специфику реализации. Есть недостатки в среде IoC, но завод по-прежнему может быть заполнен с использованием IoC, если это необходимо.

2) Ознакомьтесь с метафорой «Инверсия управления» в целом и весной в частности (как уже было предложено).

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