Шаблон стратегии в LinkedList в Java

Я пытаюсь вставить в двусвязный список, используя шаблон стратегии. Я написал этот код, поэтому следует ли ему чистый шаблон стратегии в Java? или что-то я пропустил здесь? Любые предложения будут оценены.

Обновить код:-

doubleLinkedList = new DoubleLinkedList(new ConcreteStrategyAdd());
doubleLinkedList.executeStrategy("john");
doubleLinkedList.executeStrategy("tom");
doubleLinkedList.executeStrategy("carls");

это класс

class DoubleLinkedList {

 private Strategy strategy;

 private NewLink firstNode;
 private NewLink lastNode;
 private static NewLink rootNode;

 // Constructor
 public DoubleLinkedList(Strategy strategy) {
     this.strategy = strategy;
 }

 public void executeStrategy(String a) {
    strategy.execute(a, this);
 }


    // Initializing values in the Constructor for DoubleLinkedList
    public DoubleLinkedList() {

        rootNode  = null;
        firstNode = null;
        lastNode  = null;

    }

    public boolean isEmpty() {

        return rootNode == null;

    }


}

Это интерфейс для стратегии

interface Strategy {
    void execute(String a, DoubleLinkedList list); 
}

//Реализует алгоритм с помощью интерфейса стратегии

public class ConcreteStrategyAdd implements Strategy {

    DoubleLinkedList doubleLinkedList = new DoubleLinkedList();


    public void execute(String a, DoubleLinkedList list) {
        System.out.println("Called ConcreteStrategyAdd's execute()");

        //insert here by using the logic


 }


    }
}

Я обновил код, дайте мне знать, правильно это или нет? Но с этим я не уверен, где я должен поместить свой метод вставки.


person AKIWEB    schedule 19.02.2012    source источник


Ответы (3)


Вы действительно используете шаблон стратегии, но ваша реализация ошибочна: стратегия вставляет элементы в свой частный список, отличный от списка, содержащего стратегию.

Интерфейс стратегии должен выглядеть следующим образом:

interface Strategy {
    void execute(String a, DoubleLinkedList list); 
}

Конкретная реализация должна выглядеть так:

public class ConcreteStrategyAdd implements Strategy {

    public void execute(String a, DoubleLinkedList list) {
        System.out.println("Called ConcreteStrategyAdd's execute()");
        list.insertReverseAlphabeticalOrder(a);
    }
}

И метод executeStrategy должен быть

public void executeStrategy(String a) {
    strategy.execute(a, this);
}

Кроме того, целью шаблона стратегии является возможность настройки поведения некоторого объекта без непосредственного изменения класса этого объекта. Я думаю, что в вашем классе DoubleLInkedList не должно быть метода insertReverseAlphabeticalOrder. Он должен просто иметь метод insert, а конкретная стратегия должна реализовывать логику обратного алфавитного порядка, а затем вызывать insert().

Я не знаю, что делает этот метод, поэтому приведу другой пример. Предположим, что вы хотите вставить "nhoJ" в список, когда "John" передается методу executeStrategy(). Эту стратегию можно было бы назвать «ReverseStringInsertStrategy». Его реализация будет:

public void execute(String a, DoubleLinkedList list) {
    String reversed = reverseString(a);
    list.insert(reversed);
}

Теперь предположим, что вы хотите вставить "JOHN" в список, когда "John" передается методу executeStrategy(). Эту стратегию можно было бы назвать «UppercaseStringInsertStrategy». Его реализация будет:

public void execute(String a, DoubleLinkedList list) {
    String uppercased = uppercaseString(a);
    list.insert(uppercased);
}
person JB Nizet    schedule 19.02.2012
comment
В моем коде класс DoubleLinkedList имеет метод insertReverseAlphabeticalOrder. Так куда мне вставлять? Это должно быть в методе выполнения? Можете ли вы опубликовать, где я должен вставить, чтобы это был чистый шаблон стратегии? - person AKIWEB; 19.02.2012
comment
Я не знаю, что делает insertReverseAlphabeticalOrder, поэтому сложно привести пример кода. Я говорю о том, что эту очень конкретную логику следует делегировать стратегии, а не внедрять в сам список. - person JB Nizet; 19.02.2012
comment
Я обновил код, дайте мне знать, правильно это или нет? Но с этим у меня возникла одна проблема: я не могу использовать метод isEmpty для DoublyLinkedList, так как мне нужно проверить метод isEmpty? Это дает мне ошибку. - person AKIWEB; 19.02.2012
comment
Перечитайте мой ответ: вам нужно передать список в качестве аргумента вашему методу стратегии. И метод стратегии должен вызывать методы этого переданного списка. Ваш новый код полностью нарушает инкапсуляцию списка и не может работать, поскольку в Java аргументы передаются значениями. Когда вы переназначаете firstNode новое значение, вы работаете с копией ссылки firstNode. Исходный список остается без изменений. - person JB Nizet; 19.02.2012
comment
Более того, вы полностью изменили свой вопрос, что делает существующие ответы непонятными никому, кроме вас. Вы должны принять к сведению ответы, попытаться соответствующим образом изменить свой код и задать другой вопрос с другой темой, если вы застряли. - person JB Nizet; 19.02.2012
comment
думаю, да. Но теперь я еще больше запутался :(. По вашему мнению, в вашем решении. Можете ли вы добавить некоторые методы только для справки, а не для логики, чтобы я мог легко знать, что мне нужно делать, и таким образом я смогу угадать, что у меня есть делать в этих методах.. Я знаю всю логику вставки.Но если вы можете сообщить мне точный метод, куда вставить, тогда я смогу понять больше. - person AKIWEB; 19.02.2012
comment
Я обновил код в соответствии с вашим решением. а куда вставлять, я запутался? - person AKIWEB; 19.02.2012

Да, это так. Шаблон стратегия, как следует из его названия, определяет стратегию или, другими словами, алгоритм обработки, который может использоваться для выполнения определенного действия без ведома заинтересованной стороны, что и как работает алгоритм, и это именно то, что вы реализовали.

person GETah    schedule 19.02.2012
comment
Хорошо, спасибо. Можем ли мы сделать этот код более логичным для шаблона стратегии, поскольку он выглядит более глючным? Как вы сказали мне, это правильно. Но почему-то мне кажется, что я определяю некоторые вещи гораздо чаще, чтобы упростить задачу. - person AKIWEB; 19.02.2012

Я бы разделил ответ на две части:

  • Что касается класса DoubleLinkedList, я бы сказал, что все в порядке. Вы фактически делегируете метод, предоставляемый DoubleLinkedList, базовому Strategy.
  • Если я посмотрю на вашу реализацию конкретной Стратегии, я бы сказал, что это не так; причина в том, что вы все еще встраиваете логику вставки в DoubleLinkedList. Кроме того, это должен быть список для хранения стратегии, а не наоборот (см.

    открытый класс ConcreteStrategyAdd реализует стратегию {

    DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
    

Обновление: в соответствии с комментариями я немного подробнее остановлюсь на своем заявлении о Strategy, воплощающем логику вставки.

Реализация Strategy должна знать, как именно в DoubleLinkedList должен быть вставлен элемент (упорядоченный, неупорядоченный и т. д.), а не просто вызывать метод в DoubleLinkedList. В противном случае стратегия по-прежнему воплощена в DoubleLinkedList, и вы не сможете заменить ее без изменения класса DoubleLinkedList, что является основной целью этого шаблона.

person Alessandro Santini    schedule 19.02.2012
comment
Можете ли вы сообщить мне, что должно быть фактическим способом сделать это. По вашему мнению, логика вставки должна быть в методе выполнения? Можете ли вы опубликовать код, чтобы я мог правильно понять. - person AKIWEB; 19.02.2012
comment
Вы правильно поняли. В противном случае в классе стратегий нет стратегии, это всего лишь бесполезный метод обратного вызова. - person Alessandro Santini; 19.02.2012
comment
Я обновил код, дайте мне знать, правильно это или нет? Но с этим у меня возникла одна проблема: я не могу использовать метод isEmpty для DoublyLinkedList, так как мне нужно проверить метод isEmpty? - person AKIWEB; 19.02.2012
comment
Да, теперь это намного ближе к тому, что я ожидал от реализации Стратегии. - person Alessandro Santini; 19.02.2012