Вопрос об операторе алмаза для стратегии шаблона проектированияJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Вопрос об операторе алмаза для стратегии шаблона проектирования

Сообщение Anonymous »

У меня вопрос относительно оператора ромба и стратегии шаблона проектирования для Java.
Я хотел бы реализовать очень конкретное требование:
  • есть несколько объектов для хранения (в моем примере они называются MyThingToStore)
  • и требуется хранить их с различными типами структур данных для сравнения.
Поэтому я попробовал использовать шаблон стратегии, в котором каждая из стратегий представляет собой отдельный способ хранения. Я думаю, что этот шаблон довольно хорош.
Код выглядит следующим образом:

Код: Выделить всё

public class MyThingToStore {

private final String name;

public MyThingToStore(String name) {
this.name = name;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyThingToStore that = (MyThingToStore) o;
return Objects.equals(name, that.name);
}

@Override
public int hashCode() {
return Objects.hash(name);
}

@Override
public String toString() {
return "MyThingToStore{" +
"name='" + name + '\'' +
'}';
}

}

public class MyStorage {

private final StorageStrategy storageStrategy;

public MyStorage(StorageStrategy storageStrategy) {
this.storageStrategy = storageStrategy;
}

public void addToStore(MyThingToStore myThingToStore) {
storageStrategy.addToStore(myThingToStore);
}

public int getSize() {
return storageStrategy.getSize();
}

}

public interface StorageStrategy {

void addToStore(MyThingToStore myThingToStore);

int getSize();

}

public class StorageUsingArrayListStrategy implements StorageStrategy {

private final List storeUsingArrayList = new ArrayList();

@Override
public void addToStore(MyThingToStore myThingToStore) {
storeUsingArrayList.add(myThingToStore);
}

@Override
public int getSize() {
return storeUsingArrayList.size();
}

}

public class StorageUsingHashSetStrategy implements StorageStrategy{

private final Set storeUsingHashSet = new HashSet();

@Override
public void addToStore(MyThingToStore myThingToStore) {
storeUsingHashSet.add(myThingToStore);
}

@Override
public int getSize() {
return storeUsingHashSet.size();
}

}

public class Main {

public static void main(String[] args) {
final StorageStrategy storageStrategy = new StorageUsingArrayListStrategy();
final MyStorage myStorage = new MyStorage(storageStrategy);
myStorage.addToStore(new MyThingToStore("firstItem"));
myStorage.addToStore(new MyThingToStore("duplicatedSecondItem"));
myStorage.addToStore(new MyThingToStore("duplicatedSecondItem"));
System.out.println(myStorage.getSize()); //changing strategy will return a different size, working!
}
}
И это работает нормально, очень доволен, особенно выполнено требование «легко изменить структуру данных для фактического хранения».
(Кстати, побочный вопрос, если есть еще лучший способ сделать это, дайте мне знать!)
Теперь, просматривая в Интернете различные реализации стратегических шаблонов, я вижу этого ромбовидного оператора, который мне трудно понять:

Код: Выделить всё

MyThingToStore stays the same.

public class MyStorage {

private final StorageStrategy storageStrategy; //note the diamond here

public MyStorage(StorageStrategy storageStrategy) {
this.storageStrategy = storageStrategy;
}

public void addToStore(MyThingToStore myThingToStore) {
storageStrategy.addToStore(myThingToStore);
}

public int getSize() {
return storageStrategy.getSize();
}

@Override
public String toString() {
return "MyStorage{" +
"storageStrategy=" + storageStrategy +
'}';
}

}

public interface StorageStrategy {
//note the diamond, and it will be colored differently in IDEs
void addToStore(MyThingToStore myThingToStore);

int getSize();

}

public class StorageUsingArrayListStrategy implements StorageStrategy {

private final List  storeUsingArrayList = new ArrayList();

@Override
public void addToStore(MyThingToStore myThingToStore) {
storeUsingArrayList.add(myThingToStore);
}

@Override
public int getSize() {
return storeUsingArrayList.size();
}

}

public class StorageUsingHashSetStrategy implements StorageStrategy {

private final Set storeUsingHashSet = new HashSet();

@Override
public void addToStore(MyThingToStore myThingToStore) {
storeUsingHashSet.add(myThingToStore);
}

@Override
public int getSize() {
return storeUsingHashSet.size();
}

}

public class Main {

public static void main(String[] args) {
final StorageStrategy storageStrategy = new StorageUsingArrayListStrategy();
final MyStorage myStorage = new MyStorage(storageStrategy);
myStorage.addToStore(new MyThingToStore("firstItem"));
myStorage.addToStore(new MyThingToStore("duplicatedSecondItem"));
myStorage.addToStore(new MyThingToStore("duplicatedSecondItem"));
System.out.println(myStorage.getSize()); //changing strategy will return a different size, working!
}
}

И обе версии дадут одинаковый хороший результат, а также смогут отвечать требованиям.
Каковы различия между версией без оператора ромба и версией с оператором ромба?
Какой из двух способов лучше и почему?
Хотя этот вопрос может показаться слишком расплывчатым, я считаю, что есть причина для лучшего выбора.>

Подробнее здесь: https://stackoverflow.com/questions/735 ... n-strategy
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»