Все, что вам нужно сделать, чтобы изменить 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 избегают ошибок индекса.
Точка должна разделить алгоритмы на классы, которые могут быть включены во времени выполнения. Например, скажем, у Вас есть приложение, которое включает часы. Существует много различных способов, которыми можно потянуть часы, но по большей части базовая функциональность является тем же. Таким образом, можно создать интерфейс дисплея часов:
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.
, Таким образом, можно позже добавить любой тип нового дисплея часов путем создания нового класса, не имея необходимость смешивать с классом Часов, и не имея необходимость к переопределенным методам, которые могут быть грязными, чтобы поддержать и отладить.
Стратегическая модель позволяет Вам использовать полиморфизм, не расширяя Ваш основной класс. В сущности Вы помещаете все переменные части в интерфейс стратегии и реализации и основных делегатов класса в них. Если Ваш основной объект использует только одну стратегию, это - почти то же как наличие краткого обзора (чистый виртуальный) метод и различные реализации в каждом подклассе.
подход стратегии предлагает некоторые преимущества:
, недостаток состоит в том, что во многих случаях, стратегическая модель является излишеством - оператор переключателя/случая там по причине. Рассмотрите запуск с простых операторов управления (переключатель/случай или если) тогда, только если необходимое перемещение к иерархии классов и если у Вас есть больше чем один размер изменчивости, извлеките стратегии из нее. Указатели функции падают где-нибудь посреди этого континуума.
Рекомендуемое чтение:
Существует различие между стратегией и решением/выбором. Большую часть времени мы обработали бы решения/выбор в нашем коде, и понимать их использование, если () / переключатель () создает. Стратегическая модель полезна, когда существует потребность разъединить логику/алгоритм от использования.
Как пример, Думайте о механизме опроса, где различные пользователи проверили бы на ресурсы/обновления. Теперь мы можем хотеть, чтобы некоторые priveliged пользователи были уведомлены с более быстрым сроком выполнения работы или с большим количеством деталей. Essentailly логика, используемая изменения на основе пользовательских ролей. Стратегия имеет смысл от точки наблюдения дизайна/архитектуры на более низких уровнях гранулярности, это должно всегда подвергаться сомнению.
Один способ посмотреть на это состоит в том, когда у Вас есть множество действий, Вы хотите выполниться, и те действия определяются во времени выполнения. При создании хеш-таблицы или словаря стратегий Вы могли бы получить те стратегии, которые соответствуют значениям команды или параметрам. Как только Ваше подмножество выбрано, можно просто выполнить итерации списка стратегий и выполниться по очереди.
Одним конкретным примером было бы вычисление общее количество порядка. Ваши параметры или команды были бы базисной ценой, локальным налогом, муниципальным налогом, государственным налогом, доставкой наземным транспортом и скидкой купона. Гибкость играет роль при обработке изменения заказов - некоторые состояния не будут иметь налога с продаж, в то время как другие заказы должны будут применить купон. Можно динамично присвоить порядок вычислений. Пока Вы объяснили все свои вычисления, можно разместить все комбинации без перекомпиляции.
В Java Вы используете входной поток шифра для дешифрования как так:
String path = ... ;
InputStream = new CipherInputStream(new FileInputStream(path), ???);
, Но поток шифра не знает, какого алгоритма шифрования Вы намереваетесь использовать или размер блока, дополняя стратегию и т.д... Новые алгоритмы будут добавлены все время, таким образом, жесткое кодирование их не будет практично. Вместо этого мы передаем в Шифре объект стратегии для сообщения этого, как выполнить дешифрование...
String path = ... ;
Cipher strategy = ... ;
InputStream = new CipherInputStream(new FileInputStream(path), strategy);
В целом Вы используете стратегическую модель любое время, у Вас есть любой объект, который знает , что это должно сделать, но не как , чтобы сделать это. Другим хорошим примером являются менеджеры по расположению в Swing, хотя в этом случае он не удался вполне также, см. Полностью GridBag для забавной иллюстрации.
NB: Там является двумя шаблонами на работе здесь, поскольку обертывание потоков в потоках является примером Декоратор .
Этот шаблон разработки позволяет , инкапсулируют алгоритмы в классах.
класс, который использует стратегию, клиентский класс, разъединяется от реализации алгоритма. Можно изменить реализацию алгоритмов или добавить новый алгоритм, не имея необходимость изменять клиент. Это может также быть сделано динамично: клиент может выбрать алгоритм, который он будет использовать.
Для примера, вообразите приложение, которое должно сохранить образ в файл; изображение может быть сохранено в различных форматах (PNG, JPG...). Алгоритмы кодирования будут все реализованы в различных классах, совместно использующих тот же интерфейс. Клиентский класс выберет один в зависимости от пользовательской настройки.
В примере Википедии те экземпляры могут быть переданы в функцию, которая не должна заботиться, которые классифицируют те экземпляры, принадлежат. Функция просто звонит execute
на объекте переданный, и знайте, что Правильная Вещь произойдет.
А типичный пример Стратегической модели - то, как файлы работают в Unix. Учитывая дескриптор файла, можно читать из него, записать в него, опросить его, искать на нем, отправить ioctl
с к нему, и т.д., не имея необходимость знать, имеете ли Вы дело с файлом, каталогом, каналом, сокетом, устройством, и т.д. (Конечно, некоторые операции, как ищут, не работайте над каналами и сокетами. Но чтения и записи будут работать просто великолепно в этих случаях.)
, Который означает, можно написать общий код для обработки всех этих различных типов "файлов", не имея необходимость писать отдельный код для контакта с файлами по сравнению с каталогами, и т.д. ядро Unix заботится о делегировании вызовов к правильному коду.
Теперь, это - Стратегическая модель, как используется в коде ядра, но Вы не определили, что это должен был быть пользовательский код, просто пример реального мира.:-)