Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Волк и Корова, Помогите понять Observer, пожалуйста 
V
    Опции темы
Prol
Дата 22.1.2008, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Коллеги, помогите новичку понять, как это сделать?

Волк и Корова наблюдают друг за другом, Волк гонится за Коровой и догоняет её.
У меня не получается чтоб оно хотя бы откомпилилось, более того, я не понимаю, где что вызвать :о(((

Помогите старому больному пролу понять Observer

Код

public class Volk_i_Korova {
    public static void main(String[] args) {
        Volk oVolk = new Volk(1,3);
        Korova oKorova = new Korova(10,1);    
        oVolk.addObserver(oKorova);
        oKorova.addObserver(oVolk);
    }
}


Код

import java.util.Observable;
import java.util.Observer;
public class Volk extends Observable implements Observer  {
    public int speed;
    public int x;
    public Volk(int intX, int intSpeed) {
        speed = intSpeed;
        x = intX;
    }
    public void update(Observable obj, Object arg) {
     System.out.println("See " + arg.toString());
    }
    public void setDogonat() {
     if ((Korova.x - this.x) < 3) {
         System.out.println("Popalas! " + x);
     }
     else {
         this.x += speed;
         System.out.println("Dogonat " + x);
         setChanged();
            notifyObservers();
     }
    }
}


Код

import java.util.Observable;
import java.util.Observer;
public class Korova extends Observable implements Observer  {
    public int speed;
    public int x;
    public Korova(int intX, int intSpeed) {
        speed = intSpeed;
        x = intX;
    }
    public void update(Observable obj, Object arg) {
     System.out.println("See " + arg.toString());
    }
    public void setUbegat() {
     x += speed;
        System.out.println("Ubegat " + x);
        setChanged();
        notifyObservers();
    }
}

PM MAIL WWW ICQ   Вверх
anglerhood
Дата 23.1.2008, 03:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 23.5.2007
Где: Спб

Репутация: 1
Всего: 3



Prol, 
В паттерне "наблюдатель" есть два класса объектов: объект одного класса(Наблюдатель/Observer) следит и реагирует на изменения объекта второго класса(Наблюдаемый/Obsrevable). 
Как Observer узнает, что Observable изменился? А очень просто, Observable сам уведомляет о своем изменении Observera. Получив такое уводмление  Observer обновляет свое состояние в соответствии с изменениям Observable. В учебных целях рекомендую реализовать этот паттерн без java.util
В случае с коровой и волком, каждый из классов является наблюдателем и наблюдаемым. Жизненный цикл получается такой: 
волк изменяет свое положение
волк уведомляет о своем изменении корову
корова изменяет свое положение
корова уведомляет волка о своем изменении волка
цикл

В методе update каждый клас должен изменять свое состояние, то есть Volk должен вызывать setDognat, а Korova - setUbegat. Ну и кто-то должен из них первым начать изменение.
В общем вот тебе рассказ от очевидца про корову и волка

Код

package ru.vingrad.forum;

public class VolkIKorova {
    public static void main(String[] args) {
        Volk seriy = new Volk(10,1);
        Korova milka = new Korova(3,30);    
        seriy.addObserver(milka);
        milka.addObserver(seriy);
        System.out.println("Sizhu, kurju, nikogo ne trogaju i tut...");
        seriy.setDogonat(milka);
        }
 }



Код

package ru.vingrad.forum;

import java.util.Observable;
import java.util.Observer;

public class Volk extends Observable implements Observer {
    
    private int speed;
    private int x;
    public Volk(int intSpeed, int intX) {
        speed = intSpeed;
                x = intX;
    }

    @Override
    public void update(Observable o, Object arg) {
        Korova milka = (Korova)o;
        System.out.println("Volk vidit " + milka.toString());
        setDogonat(milka);
    }
    
    public void setDogonat(Korova milka) {
        if ((milka.getX() - this.x) < 3) {
            System.out.println("Popalas! " + x);
        }
        else {
            this.x += speed;
            System.out.println("Volk kak brositsja dogonjat Milku " + x);
            setChanged();
            notifyObservers();
        }
       }
    public String toString(){
        return "Seryi volk r-r-r-r";
    }
}


Код

package ru.vingrad.forum;

import java.util.Observable;
import java.util.Observer;

public class Korova extends Observable implements Observer {

    private int speed;
    private int x;
    public int getX(){
        return x;
    }
    public Korova(int intSpeed, int intX) {
        speed = intSpeed;
        x = intX;
    }

    @Override
    public void update(Observable o, Object arg) {
        Volk seryi = (Volk)o;
        System.out.println("Milka vidit " + seryi.toString());
        setUbegat();
    }
    
    public void setUbegat() {
         x += speed;
            System.out.println("Milka dumaet nado ubegat " + x);
            setChanged();
            notifyObservers();
    }
    public String toString(){
        return "Milka mu-u-u";
    }
}



Это сообщение отредактировал(а) anglerhood - 23.1.2008, 03:31
PM MAIL ICQ   Вверх
Prol
Дата 23.1.2008, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Цитата(anglerhood @ 23.1.2008,  03:25)
Prol, 
В паттерне "наблюдатель" 

Вопросы:

- Что вы называете "паттерном"?

Добавлено через 2 минуты и 21 секунду
Цитата(anglerhood @ 23.1.2008,  03:25)
Prol, 
Жизненный цикл получается такой: 
волк изменяет свое положение
волк уведомляет о своем изменении корову
корова изменяет свое положение
корова уведомляет волка о своем изменении волка
цикл


- Цикла нету в вашем коде, скорей какая-то рекурсия хитрая :о)))

Добавлено через 5 минут и 52 секунды
Цитата(anglerhood @ 23.1.2008,  03:25)
Prol, 

    @Override

- Какой смысл в применении @Override ?

Я ведь не перекрываю никакой метод в суперклассе...

Добавлено через 9 минут и 49 секунд
Цитата(anglerhood @ 23.1.2008,  03:25)
Prol, 
Код

package ru.vingrad.forum;

public class VolkIKorova {
    public static void main(String[] args) {
        Volk seriy = new Volk(10,1);
        Korova milka = new Korova(3,30);    
        seriy.addObserver(milka);
        milka.addObserver(seriy);
        System.out.println("Sizhu, kurju, nikogo ne trogaju i tut...");
        seriy.setDogonat(milka);
        }
 }




Компилер вот такое выдаёт:

The method setDogonat() in the type Volk is not applicable for the arguments (Korova)



Это сообщение отредактировал(а) Prol - 23.1.2008, 08:59
PM MAIL WWW ICQ   Вверх
tux
Дата 23.1.2008, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 31
Всего: 132



Цитата(Prol @  23.1.2008,  08:58 Найти цитируемый пост)
- Что вы называете "паттерном"?

Паттерном называется паттерн, он же шаблон проектирования, ни что более. Prol, а что вы собственно хотите понять?

Цитата(Prol @  23.1.2008,  08:58 Найти цитируемый пост)
- Цикла нету в вашем коде, скорей какая-то рекурсия хитрая :о)))

Вам понятие жизненного цикла в принципе не знакомо?

Добавлено через 5 минут и 18 секунд
Про паттерны можно почитать здесь - http://ru.wikipedia.org/wiki/%D0%A8%D0%B0%...%BD%D0%B8%D1%8F, если есть желание.
PM MAIL Skype GTalk Jabber YIM   Вверх
Prol
Дата 23.1.2008, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Цитата(tux @ 23.1.2008,  09:22)
Цитата(Prol @  23.1.2008,  08:58 Найти цитируемый пост)
- Что вы называете "паттерном"?

Паттерном называется паттерн, он же шаблон проектирования, ни что более. 


То есть "паттерн" - это интерфейс (набор процедур проектирования и правил пользования ими)
Спасибо.

Добавлено через 4 минуты и 58 секунд
Цитата(tux @ 23.1.2008,  09:22)
Prol, а что вы собственно хотите понять?



Вот мой код. Мне непонятно следующее:

- он не хочет компилится, компилятор выдаёт
The method setDogonat() in the type Volk is not applicable for the arguments (Korova)

- мне непонятно как его остановить, если он вдруг заработает :о)))


Код

public class Volk_i_Korova {
    public static void main(String[] args) {
        Volk oVolk = new Volk(1,3);
        Korova oKorova = new Korova(10,1);    
        oVolk.addObserver(oKorova);
        oKorova.addObserver(oVolk);
        System.out.println("Sizhu, kurju, nikogo ne trogaju i tut...");
        oVolk.setDogonat(oKorova);

    }
}


Код

import java.util.Observable;
import java.util.Observer;
public class Volk extends Observable implements Observer  {
    public int speed;
    public int x;
    public Volk(int intX, int intSpeed) {
        speed = intSpeed;
        x = intX;
    }
    public void update(Observable obj, Object arg) {
     Korova milka = (Korova)obj;
        System.out.println("Volk vidit " + milka.toString());
        setDogonat(milka);
    }
    
    public void setDogonat(Korova milka) {
     if ((milka.x - this.x) < 3) {
         System.out.println("Popalas! " + x);
     }
     else {
         this.x += speed;
         System.out.println("Dogonat " + x);
         setChanged();
            notifyObservers();
     }
    }
}


Код

import java.util.Observable;
import java.util.Observer;
public class Korova extends Observable implements Observer  {
    public int speed;
    public int x;
    public Korova(int intX, int intSpeed) {
        speed = intSpeed;
        x = intX;
    }
    public void update(Observable obj, Object arg) {
     Volk seryi = (Volk)obj;
        System.out.println("Milka vidit " + seryi.toString());
        setUbegat();
    }
    public void setUbegat() {
     x += speed;
        System.out.println("Ubegat " + x);
        setChanged();
        notifyObservers();
    }
}

PM MAIL WWW ICQ   Вверх
Prol
Дата 23.1.2008, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Хлопцы, у кого-нибудь получилось скомпилить мой код последний вариант?
А то я смотрю много просматривают тему, и молчат загадочно...
PM MAIL WWW ICQ   Вверх
Kangaroo
Дата 23.1.2008, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



Цитата(Prol @  23.1.2008,  15:05 Найти цитируемый пост)
Хлопцы, у кого-нибудь получилось скомпилить мой код последний вариант?

Скомпилилось

Цитата(Prol @  23.1.2008,  08:33 Найти цитируемый пост)
мне непонятно как его остановить, если он вдруг заработает

Само остановилось:
Цитата

Sizhu, kurju, nikogo ne trogaju i tut...
Dogonat 4
Milka vidit Volk@1c78e57
Ubegat 11
Volk vidit Korova@5224ee
Dogonat 7
Milka vidit Volk@1c78e57
Ubegat 12
Volk vidit Korova@5224ee
Dogonat 10
Milka vidit Volk@1c78e57
Ubegat 13
Volk vidit Korova@5224ee
Dogonat 13
Milka vidit Volk@1c78e57
Ubegat 14
Volk vidit Korova@5224ee
Popalas! 13


На больше времени нет  smile  дома посмотрю


--------------------
Lost....
PM MAIL MSN   Вверх
Prol
Дата 23.1.2008, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



ыыы...

Вот за ето я себя ненавижу. Напишу код, он работает, почему работает, я сам непонимаю :о(((

У меня он не компилится и я не понимаю, почему он у вас останавливается именно когда волк поймал корову :о)))
PM MAIL WWW ICQ   Вверх
anglerhood
Дата 23.1.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 23.5.2007
Где: Спб

Репутация: 1
Всего: 3



Prol, 
Цитата(Prol @  23.1.2008,  08:58 Найти цитируемый пост)
- Какой смысл в применении @Override ?
Я ведь не перекрываю никакой метод в суперклассе...

Как раз перегружается метод класса Observer 

Я думаю, что основаная проблема с пониманием этого кода у тебя связана с тем, что ты пользуешься классами из java.util. Реализуй этот паттерн полностью сам и все станет намного понятнее.

Цитата(Prol @  23.1.2008,  17:25 Найти цитируемый пост)
Вот за ето я себя ненавижу. Напишу код, он работает, почему работает, я сам непонимаю :о(((

Эмоции тут излишни, протрейси построчно и много станет понятным.

Цитата(Prol @  23.1.2008,  17:25 Найти цитируемый пост)
У меня он не компилится 

Ты скопировал код класса VolkIKorova с моим указанием пакета ru.forum.vingrad. У остальных классов такой же пакет указал? Рекомендую полносьтю скопировать мой код, расставить брейкпоинты и протрейсить его.

Цитата(Prol @  23.1.2008,  17:25 Найти цитируемый пост)
почему он у вас останавливается именно когда волк поймал корову

Смотри в методе setDogonat:
Код

if ((milka.x - this.x) < 3) {
         System.out.println("Popalas! " + x);
     }

PM MAIL ICQ   Вверх
Prol
Дата 24.1.2008, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Цитата(anglerhood @ 23.1.2008,  20:26)
Prol, 
Цитата(Prol @  23.1.2008,  08:58 Найти цитируемый пост)
- Какой смысл в применении @Override ?
Я ведь не перекрываю никакой метод в суперклассе...

Как раз перегружается метод класса Observer 

Какой смысл указывать @override если и без этой инструкции работает?

Добавлено через 2 минуты и 14 секунд
Цитата(anglerhood @ 23.1.2008,  20:26)
Prol, 
Цитата(Prol @  23.1.2008,  17:25 Найти цитируемый пост)
У меня он не компилится 

Ты скопировал код класса VolkIKorova с моим указанием пакета ru.forum.vingrad. 



У меня в коде никаких винградов нету, если ты почитаешь мой код :о)

Добавлено через 5 минут и 23 секунды
Скомпилилось :о)))
Я убрал из проекта кучу тренировочных классов и скомпилилось :о)))

Добавлено через 7 минут и 1 секунду
Вобщем понял, в дефаулт пакаже не может быть двух майнов :о)
PM MAIL WWW ICQ   Вверх
Kangaroo
Дата 24.1.2008, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



Цитата(Prol @  24.1.2008,  00:36 Найти цитируемый пост)
Какой смысл указывать @override если и без этой инструкции работает?

Смысл этой инструкции:
1) Код будет читальбенее, сразу видно что этот метод перекрыт
2) Дополнительное указание компилятору. Если вы поставите @override на методе, который не перекрыт - будет ошибка компиляции


Цитата(Prol @  24.1.2008,  00:36 Найти цитируемый пост)
У меня в коде никаких винградов нету, если ты почитаешь мой код :о) 

Код работает ) Я просто скопировал, разве что импорты еклипс добавил.


--------------------
Lost....
PM MAIL MSN   Вверх
Prol
Дата 24.1.2008, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Вот универсальный класс Mobile получился.

Код

package VK;

import java.util.Observable;
import java.util.Observer;

public class Mobile extends Observable implements Observer  {
    public int speed;
    public int x;
    public int ai;
    public Mobile(int intX, int intSpeed, int intAI) {
        speed = intSpeed;
        x = intX;
        ai = intAI; // 1 - AI volka, 2- AI korovy
    }
    public void update(Observable obj, Object arg) {
     Mobile neJa = (Mobile)obj;
        switch (ai) {
        case 1:
         System.out.println("Volk gonitsa za " + neJa.toString());
         setDogonat(neJa);
         break;
        case 2:
         System.out.println("Korova ubegaet ot " + neJa.toString());
         setUbegat();
         break;
        }
        
    }
    public void setDogonat(Mobile zhertva) {
     if ((zhertva.x - this.x) < 3) {
         System.out.println("Popalas! " + x);
     }
     else {
         this.x += speed;
         System.out.println("Dogonat " + x);
         setChanged();
            notifyObservers();
     }
    }
    public void setUbegat() {
     x += speed;
        System.out.println("Ubegat " + x);
        setChanged();
        notifyObservers();
    }
}


Пример использования

Код

import VK.Mobile;

public class Volk_i_Korova {
    public static void main(String[] args) {
        Mobile oVolk = new Mobile(1,3,1);
        Mobile oKorova = new Mobile(10,1,2);    
        oVolk.addObserver(oKorova);
        oKorova.addObserver(oVolk);

        System.out.println("Sizhu, kurju, nikogo ne trogaju i tut...");
                                oVolk.setDogonat(oKorova);
    }
}


Прога завершает работу, потому что когда корова попалась, то волк не делает notifyObservers()

Я правильно понял?

Это сообщение отредактировал(а) Prol - 24.1.2008, 02:35
PM MAIL WWW ICQ   Вверх
Prol
Дата 24.1.2008, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

Репутация: нет
Всего: нет



Спасибо за помощь :о)
PM MAIL WWW ICQ   Вверх
Kangaroo
Дата 24.1.2008, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



Цитата(Prol @  24.1.2008,  01:33 Найти цитируемый пост)
Прога завершает работу, потому что когда корова попалась, то волк не делает notifyObservers()

Ну да.


--------------------
Lost....
PM MAIL MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0637 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.