Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 57
1

Паттерн наблюдателя ( Observer )

16.12.2016, 18:19. Показов 3398. Ответов 6

Author24 — интернет-сервис помощи студентам
Доброго времени суток, прошу помочь с моим заданием. Есть хранилище объектов и элемент TreeView. Надо используя вышеупомянутый сделать так, чтобы TreeView отображало содержимое хранилища в реальном времени. Т.е. если объект был создан и помещен в хранилище, добавить строку с именем объекта ( у меня геометрические фигуры, поэтому строки типа "-круг", "-треугольник"...), а если удален, то пропадает соответствующая этому элементу строка.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
        public class IObserver 
        {
            public virtual void Update(CShape a){}
        }
        
        public class Observer: IObserver
        {
            public Observer(){}
            
            public override void Update(CShape a)
            {
                //TreeNode tn = new TreeNode();
                // tn.Name = a.Name;
                // Update(a);
                /* if(a is CGroup)
                    foreach( CShape f in CGroup)
                        Update(f,tn);*/
            }
        }
        
        public class IObservable
        {
            public virtual void AddObserver(IObserver o){}
            public virtual void RemoveObserver(IObserver o){}
            public virtual void Notify(){}
        }
 
        public class Subject: IObservable 
        {
            public List<IObserver> _obs;
            
            public Subject()
            {
                _obs = new List<IObserver>();
            }
            
            public override void AddObserver(IObserver o)
            {
                _obs.Add(o);
            }
            
            public override void RemoveObserver(IObserver o)
            {
                _obs.Remove(o);
            }
            
            public override void Notify()
            {
                TreeNode f = new TreeNode();
                for(int i=0; i<_obs.Count;++i)
                    _obs[i].Update(this);
            }
        }
          public class CShape: Subject{}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2016, 18:19
Ответы с готовыми решениями:

Как реализовать Observer паттерн
Необходимо реализовать Observer паттерн. Реализация через public void Publish&lt;TEvent&gt;(TEvent...

паттерн Observer
Гуру программирования, просветите по данному сабжу (расскажите человеческим языком/направьте...

паттерн наблюдатель (observer)
Помогите разобраться. Нашел в интернете несколько примеров но по ним я не могу понять как они...

Как вы используете паттерн Observer?
Я изучил этот паттерн и использовал его в своей программе. У меня класс Контроллер является...

6
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
16.12.2016, 19:13 2
В c# есть Интерфейс IObserver<T>.
Почему его не реализовать?

Добавлено через 2 минуты
Цитата Сообщение от Киловат Посмотреть сообщение
сделать так, чтобы TreeView отображало содержимое хранилища в реальном времени. Т.е. если объект был создан и помещен в хранилище, добавить строку с именем объекта
У TreeView есть свои события для этого. Вам правда паттерн наблюдатель нужен?
0
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 57
16.12.2016, 21:19  [ТС] 3
Цитата Сообщение от John999 Посмотреть сообщение
В c# есть Интерфейс IObserver<T>.
Почему его не реализовать?
Задание такое, что надо все это прописать самому.
0
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
16.12.2016, 21:21 4
Цитата Сообщение от Киловат Посмотреть сообщение
и помещен в хранилище
А что такое ,где хранилище?
Цитата Сообщение от Киловат Посмотреть сообщение
добавить строку с именем объекта
Куда ?
0
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 57
16.12.2016, 21:31  [ТС] 5
Цитата Сообщение от John999 Посмотреть сообщение
А что такое ,где хранилище?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Storage<CShape> storage = new Storage<CShape>();
   
public class Storage<T>
        {
            private int top;
            public T [] s;
         
            public Storage()
            {
                top = 0;
                s = new T[top];
            }
         
            public void Add(T var)
            {
                T [] a = new T[top+1];
                for (int i=0; i<top; i++) a[i] = s[i];
                a[top]= var;
                top++;
                s = a;
            }
         
            public void Remove(int index)
            {
                if (top == 0) return;
                T[] a = new T[top-1];
                for(int i=0, j=0; i<top; i++)
                {
                    if(i != index)
                    {
                        a[j]=s[i];
                        j++;
                    }
                }
                s = a;
                top--;
            }
         
            public T this[int index]
            {
                get { return s[index]; }
            }
         
            public int getCount
            {
                get {return top;}
            }
}
Вот класс хранилища для объектов CSharp.

Цитата Сообщение от John999 Посмотреть сообщение
Куда ?
В элемент управления TreeView
0
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 57
16.12.2016, 21:35  [ТС] 6
Надо сделать такое же, но только через паттерн Observer.
Миниатюры
Паттерн наблюдателя ( Observer )  
0
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
17.12.2016, 05:03 7
Лучший ответ Сообщение было отмечено Киловат как решение

Решение

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

Проверил: по кнопке создаю фигуру, добавляю в Storage.
На другой кнопке удаляю первый элемент из Storage.


interface IMyObserver
C#
1
2
3
4
5
public interface IMyObserver
    {
        void UpdateCreate(IMyObservable a);
        void UpdateDelete(IMyObservable a);
    }

interface IMyObservable
C#
1
2
3
4
5
6
7
 public interface IMyObservable
    {
        void AddObserver(IMyObserver o);
        void RemoveObserver(IMyObserver o);
        void NotifyCreate();
        void NotifyDelete();
    }

class CShape
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 public class CShape : IMyObservable
    {
        public List<IMyObserver> _obs;
 
        public CShape()
        {
            _obs = new List<IMyObserver>();
        }
 
        public void AddObserver(IMyObserver o)
        {
            _obs.Add(o);
        }
 
        public void RemoveObserver(IMyObserver o)
        {
            _obs.Remove(o);
        }
 
        public void NotifyCreate()
        {
            for (int i = 0; i < _obs.Count; ++i)
                _obs[i].UpdateCreate(this);
        }
 
        public void NotifyDelete()
        {
            for (int i = 0; i < _obs.Count; ++i)
                _obs[i].UpdateDelete(this);
        }
    }
class Storage
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    public class Storage<T> where T : IMyObservable
    {
        private int top;
        public T[] s;
 
        public Storage()
        {
            top = 0;
            s = new T[top];
        }
 
        public void Add(T var)
        {
            T[] a = new T[top + 1];
            for (int i = 0; i < top; i++) a[i] = s[i];
            a[top] = var;
            a[top].NotifyCreate();
            top++;
            s = a;
        }
 
        public void Remove(int index)
        {
            if (top == 0) return;
            s[index].NotifyDelete();
            T[] a = new T[top - 1];
            for (int i = 0, j = 0; i < top; i++)
            {
                if (i != index)
                {
                    a[j] = s[i];
                    j++;
                }
            }
            s = a;
            top--;
        }
 
        public T this[int index]
        {
            get { return s[index]; }
        }
 
        public int getCount
        {
            get { return top; }
        }
    }


class Form1
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    public partial class Form1 : Form, IMyObserver
    {
 
        public Form1()
        {
            InitializeComponent();
        }
   
        Storage<CShape> storage = new Storage<CShape>();
 
        private void button1_Click(object sender, EventArgs e)
        {
            var shape = new CShape();
            shape.AddObserver(this); // добавляем подписчика
            storage.Add(shape);
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            storage.Remove(0);
        }
 
        public void UpdateCreate(IMyObservable a)
        {
            TreeNode node = new TreeNode(a.GetType().Name);
            node.Name = a.GetType().Name;
            treeView1.Nodes.Add(node);
        }
 
        public void UpdateDelete(IMyObservable a)
        {
            TreeNode[] nodes = treeView1.Nodes.Find(a.GetType().Name, true);
            if (nodes.Length > 0)
                treeView1.Nodes.Remove(nodes[0]);
        }
    }
1
17.12.2016, 05:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.12.2016, 05:03
Помогаю со студенческими работами здесь

паттерн Observer(непонятна строка кода)
Непонятный код в одном месте. Хотелось бы узнать смысл и для чего его тут написали. class...

паттерн Observer(непонятна строка кода)
Непонятный код в одном месте. Хотелось бы узнать смысл и для чего его тут написали. class...

Почему паттерн абстрактная фабрика - паттерн уровня объектов, если в нём могут быть статические отношения?
Взято из Шевчук А., Охрименко Д., Касьянов А. Design Patterns via C#. Приемы...

Observer и Observable
Есть код с применением Observer и Observable import java.util.*; import java.lang.*; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru