Где преимущество в использовании Стратегической модели?

Все, что вам нужно сделать, чтобы изменить button.text:

button.text = "something";

Но для вашего второго вопроса ваш Ai должен быть примерно таким:

try{
for(var k =-1;k<2;k++){ //k is the parameter responsible for previous and 
//next also up and down cells and even also the upper right , bottom right,bottom left and bottom right cells.
for(var i =0;k<3;i++)
{ 
for(var j =0;k<3;j++)
{
if(x[i,j]==x[i+k,j+k]  && ((i+k<3)&&(j+k<3)) //checks if there is two cells having the same "X" in a row.
{
button.text = "O"
}
}
}
}
}
catch(Exception e){
//nothing

}

Я положил блоки try try избегают ошибок индекса.

12
задан James Curran 5 October 2008 в 12:57
поделиться

7 ответов

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

class IClockDisplay
{
    public:
       virtual void Display( int hour, int minute, int second ) = 0;
};

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

class Clock
{
   protected:
      IClockDisplay* mDisplay;
      int mHour;
      int mMinute;
      int mSecond;

   public:
      Clock( IClockDisplay* display )
      {
          mDisplay = display;
      }

      void Start(); // initiate the timer

      void OnTimer()
      {
         mDisplay->Display( mHour, mMinute, mSecond );
      }

      void ChangeDisplay( IClockDisplay* display )
      {
          mDisplay = display;
      }
};

Тогда во времени выполнения Вы инстанцируете своих часов с надлежащим классом дисплея. т.е. у Вас могли быть ClockDisplayDigital, ClockDisplayAnalog, ClockDisplayMartian вся реализация интерфейса IClockDisplay.

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

21
ответ дан 2 December 2019 в 03:22
поделиться

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

подход стратегии предлагает некоторые преимущества:

  • можно измениться, стратегия во времени выполнения - сравнивают это с изменением типа класса во времени выполнения, которое является намного более трудным, компилятор, конкретный и невозможный для невиртуальных методов
  • , один основной класс может использовать больше чем одну стратегию, который позволяет Вам повторно комбинировать их несколькими способами. Рассмотрите класс, который обходит дерево и оценивает функцию на основе каждого узла и текущего результата. У Вас могут быть стратегия обхода (в глубину или в ширину) и стратегия вычисления (некоторый функтор - т.е. 'считают положительные числа' или 'сумму'). Если Вы не будете использовать стратегии, то необходимо будет реализовать подкласс для каждой комбинации обхода/вычисления.
  • код легче поддержать, поскольку изменяющая или понимающая стратегия не требует, чтобы Вы поняли целый основной объект

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

Рекомендуемое чтение:

4
ответ дан 2 December 2019 в 03:22
поделиться

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

Как пример, Думайте о механизме опроса, где различные пользователи проверили бы на ресурсы/обновления. Теперь мы можем хотеть, чтобы некоторые priveliged пользователи были уведомлены с более быстрым сроком выполнения работы или с большим количеством деталей. Essentailly логика, используемая изменения на основе пользовательских ролей. Стратегия имеет смысл от точки наблюдения дизайна/архитектуры на более низких уровнях гранулярности, это должно всегда подвергаться сомнению.

5
ответ дан 2 December 2019 в 03:22
поделиться

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

Одним конкретным примером было бы вычисление общее количество порядка. Ваши параметры или команды были бы базисной ценой, локальным налогом, муниципальным налогом, государственным налогом, доставкой наземным транспортом и скидкой купона. Гибкость играет роль при обработке изменения заказов - некоторые состояния не будут иметь налога с продаж, в то время как другие заказы должны будут применить купон. Можно динамично присвоить порядок вычислений. Пока Вы объяснили все свои вычисления, можно разместить все комбинации без перекомпиляции.

2
ответ дан 2 December 2019 в 03:22
поделиться

В Java Вы используете входной поток шифра для дешифрования как так:

String path = ... ;
InputStream = new CipherInputStream(new FileInputStream(path), ???);

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

String path = ... ;
Cipher strategy = ... ;
InputStream = new CipherInputStream(new FileInputStream(path), strategy);

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

NB: Там является двумя шаблонами на работе здесь, поскольку обертывание потоков в потоках является примером Декоратор .

10
ответ дан 2 December 2019 в 03:22
поделиться

Этот шаблон разработки позволяет , инкапсулируют алгоритмы в классах.

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

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

2
ответ дан 2 December 2019 в 03:22
поделиться

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

А типичный пример Стратегической модели - то, как файлы работают в Unix. Учитывая дескриптор файла, можно читать из него, записать в него, опросить его, искать на нем, отправить ioctl с к нему, и т.д., не имея необходимость знать, имеете ли Вы дело с файлом, каталогом, каналом, сокетом, устройством, и т.д. (Конечно, некоторые операции, как ищут, не работайте над каналами и сокетами. Но чтения и записи будут работать просто великолепно в этих случаях.)

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

Теперь, это - Стратегическая модель, как используется в коде ядра, но Вы не определили, что это должен был быть пользовательский код, просто пример реального мира.:-)

1
ответ дан 2 December 2019 в 03:22
поделиться
Другие вопросы по тегам:

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