294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,993
Записей в блоге: 1
1
.NET 4.x

Как реализовать паттерн Хранитель при использовании ссылочных типов

27.06.2017, 07:51. Показов 1970. Ответов 30

Author24 — интернет-сервис помощи студентам
Каким образом можно использовать паттерн "хранитель" при хранении ссылочных типов? Т.е. состояние изменяется несколько раз и необходимо возвращение к предыдущему а не к первому? Может быть сериализация?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2017, 07:51
Ответы с готовыми решениями:

Как запретить преобразование типов при использовании cin
Как запретить преобразование типов при использовании объекта потокового ввода cin. Проблема в том,...

Инкапсуляция ссылочных типов
Здравствуйте! Имеется такой класс (что-то вроде обёртки). public class ArrayWrapper { private...

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

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

30
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,993
Записей в блоге: 1
29.06.2017, 13:53  [ТС] 21
Author24 — интернет-сервис помощи студентам
Реализация паттерна: результат ручного труда (написания текста) части программного кода, отвечающего заданным критериям паттерна, правилам паттерна. К примеру, реализация паттерна Фабрика (Фабричный метод):
Кликните здесь для просмотра всего текста
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
55
56
57
58
59
60
61
62
63
64
65
class Program
{
    static void Main(string[] args)
    {
        Developer dev = new PanelDeveloper("ООО КирпичСтрой");
        House house2 = dev.Create();
         
        dev = new WoodDeveloper("Частный застройщик");
        House house = dev.Create();
 
        Console.ReadLine();
    }
}
// абстрактный класс строительной компании
abstract class Developer
{
    public string Name { get; set; }
 
    public Developer (string n)
    { 
        Name = n; 
    }
    // фабричный метод
    abstract public House Create();
}
// строит панельные дома
class PanelDeveloper : Developer
{
    public PanelDeveloper(string n) : base(n)
    { }
 
    public override House Create()
    {
        return new PanelHouse();
    }
}
// строит деревянные дома
class WoodDeveloper : Developer
{ 
    public WoodDeveloper(string n) : base(n)
    { }
 
    public override House Create()
    {
        return new WoodHouse();
    }
}
 
abstract class House
{ }
 
class PanelHouse : House 
{ 
    public PanelHouse()
    {
        Console.WriteLine("Панельный дом построен");
    }
}
class WoodHouse : House
{ 
    public WoodHouse()
    {
        Console.WriteLine("Деревянный дом построен");
    }
}


Под словами "реализация паттерна Хранитель" имелось в виду именно это. Не то, что туда передаётся (за исключением обозначенного в заголовке именно "ссылочного типа"). Не познавательные лекции о возможностях языка. Не способы обработки объектов программирования в виде клонирования.
Если и сейчас опять непонятно, сорян. Подожду других участников форума.
0
Эксперт .NET
12087 / 8366 / 1279
Регистрация: 21.01.2016
Сообщений: 31,542
29.06.2017, 14:09 22
skilllab, т.е. вам словесного описания мало было? Про создание класса с копированием в него данных? Просто это полностью описывает данный паттерн.

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

Кликните здесь для просмотра всего текста

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
    class ClassWithState
    {
        private string UserName;
        private int UserAge;
 
        public StateOfClassWithState GetState()
        {
            return new StateOfClassWithState(
                this.UserName, this.UserAge
                );
        }
 
        public void SetState(StateOfClassWithState state)
        {
            state.Restore(this);
        }
 
        public class StateOfClassWithState
        {
            private bool invalid = true;
 
            private string userName;
            private int userAge;
 
            public StateOfClassWithState(string userName, int userAge)
            {
                this.userAge = userAge;
                this.userName = userName;
                this.invalid = false;
            }
 
            public void Restore(ClassWithState stater)
            {
                if (this.invalid)
                {
                    throw new Exception();
                }
                stater.UserAge = this.userAge;
                stater.UserName = this.userName;
                this.invalid = true;
            }
        }
    }


Добавлено через 1 минуту
Возможны и другие реализации данного паттерна. Но суть его одна - просто вынос состояния одного объекта в виде другого. Если вам уже и это не понятно, то сорян, ждите кого-нибудь, кто умеет объяснять на пальцах.
1
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
29.06.2017, 14:15 23
Цитата Сообщение от skilllab Посмотреть сообщение
Psilon, оно конечно познавательно, но на вопрос темы не отвечает.
Ну как же. Если объект неизменяемый, то задача хранителя просто сохранить ссылку на него.
0
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,993
Записей в блоге: 1
29.06.2017, 14:23  [ТС] 24
Цитата Сообщение от Usaga Посмотреть сообщение
Если вам уже и это не понятно
То что вы написали - понятно и наглядно. Где там ответ на вопрос - фиг знает. Вы просто восстанавливаете состояние класса. Я вас понял. Мы "обсорянились", подожду других))
Цитата Сообщение от Psilon Посмотреть сообщение
задача хранителя просто сохранить
задача Хранителя описана прям в названии паттерна и в его описании. Что тут может быть непонятного и зачем вы это уточняете (риторический).
0
Эксперт .NET
12087 / 8366 / 1279
Регистрация: 21.01.2016
Сообщений: 31,542
29.06.2017, 14:26 25
Цитата Сообщение от skilllab Посмотреть сообщение
Где там ответ на вопрос - фиг знает.
Фрагмент кода и есть ответ на вопрос - это результат ручного труда (написания текста) части программного кода, отвечающего заданным критериям паттерна, правилам паттерна. Т.е. представленный код реализует данный паттерн. Один из его вариантов.

Добавлено через 46 секунд
Или эта реализация не так реализация, которую вы понимаете под словом "реализация"?
0
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,993
Записей в блоге: 1
29.06.2017, 14:38  [ТС] 26
Цитата Сообщение от Psilon Посмотреть сообщение
Если объект неизменяемый
"Как быть с йетти?"
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class TestClass
{
     public string MyTestString {get;set;}
     public int MyInt {get;set;}
     public string TestClass(string _innerString, int _innerInt)
      { 
         MyTestString = _innerString;
         MyInt = _innerInt;
      }
}
 
...
TestClass testClass = new TestClass ("One", 1); //(0)
/// need save state 
testClass.MyTestString = "Two";
// need save state (1)
testClass.MyInt = 2;
// need save state (2)
testClass.MyTestString = "Three";
// restore to (1)
Добавлено через 2 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
отвечающего заданным критериям паттерна, правилам паттерна
Я вам предлагаю википедировать ваши знания о данной теме https://ru.wikipedia.org/wiki/... тирования))
отступления от общепринятого понятия "паттерн Хранитель" - не есть паттерн Хранитель, а лишь ваша интерпретация единичного сохранения состояния одного immutable класса. опять сорянимся? Или дальше будем словоблудить? )))
0
Эксперт .NET
12087 / 8366 / 1279
Регистрация: 21.01.2016
Сообщений: 31,542
29.06.2017, 14:43 27
skilllab, если вы точно знаете, что есть паттерн "Хранитель", как он выглядит и реализуется и уверено можете определить, что им не является, и даже ссылками кидаетесь с примерами кода, то что именно вы спрашиваете?))))))))))))))) Или в википедии реализация тоже не достаточно реализационная?))))
0
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,993
Записей в блоге: 1
29.06.2017, 14:52  [ТС] 28
Usaga, я не понял, мне нужно объяснять почему ваш ответ не отвечает на поставленный вопрос в теме? Зачем мне это? Зачем ВАМ это? Вы высказались, вас услышали.
0
Эксперт .NET
12087 / 8366 / 1279
Регистрация: 21.01.2016
Сообщений: 31,542
29.06.2017, 16:27 29
skilllab, я так и не смог понять, что вам надо. Видимо мне это не дано.
0
653 / 589 / 171
Регистрация: 17.07.2012
Сообщений: 1,670
Записей в блоге: 1
29.06.2017, 17:04 30
Кликните здесь для просмотра всего текста
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System;
using System.Collections.Generic;
 
namespace CyberForum
{
    class Memento
    {
        private readonly string state;
 
        public Memento(string state)
        {
            this.state = state;
        }
 
        public string GetState()
        {
            return this.state;
        }
    }
 
    class Originator
    {
        public string State { get; set; }
 
        public void SetMemento(Memento memento)
        {
            this.State = memento.GetState();
        }
 
        public Memento CreateMemento()
        {
            return new Memento(this.State);
        }
    }
 
    class Caretaker
    {
        private static Stack<Memento> savedStates = new Stack<Memento>();
 
        public void SaveState(Originator originator)
        {
            savedStates.Push(originator.CreateMemento());
        }
 
        public void RestoreState(Originator originator)
        {
            originator.SetMemento(savedStates.Pop());
        }
    }
 
    class Program
    {
 
        static void Main(string[] args)
        {
            var originator = new Originator();
            var careTaker = new Caretaker();
            originator.State = "state1";
            careTaker.SaveState(originator);
            originator.State = "state2";
            careTaker.SaveState(originator);
            Console.WriteLine(originator.State); //state2
            originator.State = "state3";
            Console.WriteLine(originator.State); //state3
            careTaker.RestoreState(originator);
            Console.WriteLine(originator.State); //state2
            careTaker.RestoreState(originator);
            Console.WriteLine(originator.State); //state1
            Console.ReadKey();
        }
    }
}
0
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,993
Записей в блоге: 1
29.06.2017, 18:11  [ТС] 31
Цитата Сообщение от Cupko Посмотреть сообщение
private readonly string state;
тут кроется засада
------------------
Уточняю тематический вопрос: можно ли использовать паттерн Хранитель с ссылочным mutable типом?
Если можно, то как реализовать паттерн? Тут подразумевается не сериализация типа или его клонирование, а как этот тип используется в коде паттерна. Т.е. пример использования.
Если нельзя - то тогда ладно
0
29.06.2017, 18:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.06.2017, 18:11
Помогаю со студенческими работами здесь

ArrayList для ссылочных типов
Здравствуйте. Правда ли, что при наполнении ArrayList ссылочными типами, то операции...

Особенности использования ссылочных типов
Доброе время суток всем.Подскажите по поводу ссылочных типов ,я что то не могу понять.Есть кусок...

Троелсен, Передача ссылочных типов по значению
class Person { } static void SendAPersonByValue(Person p) //получена копия ссылки на объект из...

Бинарное дерево с использованием ссылочных типов
Здравствуйте! Я продолжаю изучение Пролога в универе (работаю на прологе 7.5). Задали задание...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Опции темы

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