Как Стратегическая модель работает? [закрытый]

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

63
задан user151019 8 May 2012 в 16:46
поделиться

5 ответов

Давайте объясним стратегическую модель простой способ:

у Вас есть класс Car() с методом run(), таким образом, Вы используете его этот путь на псевдо языке:

mycar = new Car()
mycar.run()

Теперь, можно хотеть измениться run() поведение на лету, в то время как программа выполняется. Например, Вы могли бы хотеть моделировать моторный отказ или использование кнопки "повышения" в видеоигре.

существует несколько способов сделать это моделирование: использование условных операторов и переменной флага является одним путем. Стратегическая модель - другой: это делегирует поведение run() метод к другому классу:

Class Car()
{
    this.motor = new Motor(this) 

    // passing "this" is important for the motor so it knows what it is running

    method run()
    {
        this.motor.run()
    }

    method changeMotor(motor)
    {
        this.motor = motor 
    }

}

, Если Вы хотите изменить поведение автомобиля, можно просто изменить двигатель. (Легче в программе, чем в реальной жизни, правильно?;-))

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

78
ответ дан user3399000 24 November 2019 в 16:12
поделиться

Проблема

стратегическая модель используется для решения проблем, которые могли бы (или предсказываться, они могли бы) быть реализованным или решенным различным стратегии и которые обладают ясно определенным интерфейсом для таких случаев. Каждая стратегия совершенно действительна самостоятельно с некоторыми стратегиями, являющимися предпочтительным в определенных ситуациях, которые позволяют приложению переключаться между ними во время времени выполнения.

Пример кода

namespace StrategyPatterns
{
  // Interface definition for a Sort algorithm
  public interface ISort
  {
    void Sort(List<string> list)
  }

  // QuickSort implementation
  public class CQuickSorter : ISort
  {
    void Sort(List<string> list)
    {
      // Here will be the actual implementation
    }
  }

  // BubbleSort implementation
  public class CBubbleSort : ISort
  {
    void Sort(List<string> list)
    {
      // The actual implementation of the sort
    }
  }

  // MergeSort implementation
  public class CMergeSort : ISort
  {
    void Sort(List<string> list)
    {
      // Again the real implementation comes here
    }
  }

  public class Context
  {
    private ISort sorter;

    public Context(ISort sorter)
    {
      // We pass to the context the strategy to use
      this.sorter = sorter;
    }

    public ISort Sorter
    {
      get{return sorter;)
    }
  }

  public class MainClass
  {
    static void Main()
    {
       List<string> myList = new List<string>();

       myList.Add("Hello world");
       myList.Add("Another item");
       myList.Add("Item item");

       Context cn = new Context(new CQuickSorter());
       // Sort using the QuickSort strategy
       cn.Sorter.Sort(myList);
       myList.Add("This one goes for the mergesort");
       cn = new Context(new CMergeSort());
       // Sort using the merge sort strategy
       cn.Sorter.Sort(myList);
    }
  }
}
38
ответ дан Mateen Ulhaq 24 November 2019 в 16:12
поделиться

Тесно связанный шаблон является шаблоном Делегата; в обоих случаях часть работы передается некоторому другому компоненту. Если я понимаю правильно, различие между этими шаблонами - это (и исправьте меня, если я неправ):

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

  • В шаблон Стратегии , компонент, который осуществляет стратегию, является зависимостью, предоставленной включению с помощью компонента через его конструктора или метод set (согласно религии). Компонент использования полностью не знает о том, какая стратегия используется; стратегия всегда вызывается через интерфейс.

Кто-либо знает какие-либо другие различия?

6
ответ дан Andrew Swan 24 November 2019 в 16:12
поделиться

Непосредственно от статья Strategy Pattern Wikipedia:

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

6
ответ дан Bill the Lizard 24 November 2019 в 16:12
поделиться

Уже добавить к magnificient ответы: стратегическая модель имеет сильное сходство с передачей функции (или функций) к другой функции. В стратегии это сделано путем обертывания, сказала функция в объекте, сопровождаемом путем передачи объекта. Некоторые языки могут передать функции непосредственно, таким образом, им не нужен шаблон вообще. Но другие языки не могут передать функции, но может объекты передачи; шаблон тогда применяется.

Особенно на подобных Java языках, Вы найдете, что зоопарк типа языка является довольно небольшим и что Ваш единственный способ расширить его путем создания объектов. Следовательно большинство решений проблем состоит в том, чтобы придумать шаблон; способ составить объекты достигнуть определенной цели. Языки с более богатыми зоопарками типа часто имеют более простые способы идти о проблемах - но более богатые типы также означают, что необходимо провести больше времени, изучая систему типов. Языки с дисциплиной динамического контроля типов часто получают подлый путь вокруг проблемы также.

5
ответ дан I GIVE CRAP ANSWERS 24 November 2019 в 16:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: