2012-02-19 3 views
0

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


} 


    } 
} 

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

ответ

0

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

+0

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

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» в список, когда «Джон» передается методу executeStrategy(). Эту стратегию можно назвать «ReverseStringInsertStrategy». Его реализация будет:

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

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

public void execute(String a, DoubleLinkedList list) { 
    String uppercased = uppercaseString(a); 
    list.insert(uppercased); 
} 
+0

В моем коде класс DoubleLinkedList имеет метод insertReverseAlphabeticalOrder. Итак, куда мне вставить? Это должно быть в методе выполнения? Можете ли вы опубликовать, где я должен вставить, чтобы он был чистым шаблоном стратегии? – AKIWEB

+0

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

+0

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

0

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

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

    общественного класса ConcreteStrategyAdd реализует стратегию {

    DoubleLinkedList doubleLinkedList = new DoubleLinkedList(); 
    

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

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

+0

Можете ли вы сообщить мне, каков должен быть фактический способ сделать это. Согласно логике вставки следует использовать метод выполнения? Можете ли вы опубликовать некоторый код, чтобы я мог правильно поняли. – AKIWEB

+0

Вы правильно поняли.В противном случае в стратегическом классе нет «стратегии», это всего лишь бесполезный метод обратного вызова. –

+0

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

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