我正在尝试使用策略模式插入双向链表。我编写了这段代码,那么这是否遵循 Java 中的纯策略模式?或者我在这里缺少什么?任何建议将不胜感激。
更新代码:-
doubleLinkedList = new DoubleLinkedList(new ConcreteStrategyAdd());
doubleLinkedList.executeStrategy("john");
doubleLinkedList.executeStrategy("tom");
doubleLinkedList.executeStrategy("carls");
这就是类(class)
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);
}
//使用策略接口(interface)实现算法
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
}
}
}
我已经更新了代码,请告诉我这是否正确?但这样我不知道应该把插入方法放在哪里。
最佳答案
您确实使用了策略模式,但您的实现存在错误:该策略将项目插入其私有(private)的、与包含该策略的列表不同的列表中。
策略界面应如下所示:
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()
。
我不知道这个方法是做什么的,所以我再给你一个例子。假设您希望在将“John”传递给 executeStrategy()
方法时将“nhoJ”插入到列表中。该策略可以称为“ReverseStringInsertStrategy”。它的实现是:
public void execute(String a, DoubleLinkedList list) {
String reversed = reverseString(a);
list.insert(reversed);
}
现在假设您希望在将“John”传递给 executeStrategy()
方法时将“JOHN”插入到列表中。该策略可以称为“UppercaseStringInsertStrategy”。它的实现是:
public void execute(String a, DoubleLinkedList list) {
String uppercased = uppercaseString(a);
list.insert(uppercased);
}
关于java - java中LinkedList的策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9348047/