Шаблон стратегии в LinkedList в Java - PullRequest
0 голосов
/ 19 февраля 2012

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


 }


    }
}

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

Ответы [ 3 ]

3 голосов
/ 19 февраля 2012

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

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

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);
}
0 голосов
/ 19 февраля 2012

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

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

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

    DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
    

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

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

0 голосов
/ 19 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...