Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
.NET 4.x

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

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

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

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

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

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

30
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
29.06.2017, 13:53  [ТС]
Студворк — интернет-сервис помощи студентам
Реализация паттерна: результат ручного труда (написания текста) части программного кода, отвечающего заданным критериям паттерна, правилам паттерна. К примеру, реализация паттерна Фабрика (Фабричный метод):
Кликните здесь для просмотра всего текста
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
 Аватар для Usaga
14357 / 9458 / 1360
Регистрация: 21.01.2016
Сообщений: 35,669
29.06.2017, 14:09
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
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
29.06.2017, 14:15
Цитата Сообщение от skilllab Посмотреть сообщение
Psilon, оно конечно познавательно, но на вопрос темы не отвечает.
Ну как же. Если объект неизменяемый, то задача хранителя просто сохранить ссылку на него.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
29.06.2017, 14:23  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Если вам уже и это не понятно
То что вы написали - понятно и наглядно. Где там ответ на вопрос - фиг знает. Вы просто восстанавливаете состояние класса. Я вас понял. Мы "обсорянились", подожду других))
Цитата Сообщение от Psilon Посмотреть сообщение
задача хранителя просто сохранить
задача Хранителя описана прям в названии паттерна и в его описании. Что тут может быть непонятного и зачем вы это уточняете (риторический).
0
Эксперт .NET
 Аватар для Usaga
14357 / 9458 / 1360
Регистрация: 21.01.2016
Сообщений: 35,669
29.06.2017, 14:26
Цитата Сообщение от skilllab Посмотреть сообщение
Где там ответ на вопрос - фиг знает.
Фрагмент кода и есть ответ на вопрос - это результат ручного труда (написания текста) части программного кода, отвечающего заданным критериям паттерна, правилам паттерна. Т.е. представленный код реализует данный паттерн. Один из его вариантов.

Добавлено через 46 секунд
Или эта реализация не так реализация, которую вы понимаете под словом "реализация"?
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
29.06.2017, 14:38  [ТС]
Цитата Сообщение от 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
 Аватар для Usaga
14357 / 9458 / 1360
Регистрация: 21.01.2016
Сообщений: 35,669
29.06.2017, 14:43
skilllab, если вы точно знаете, что есть паттерн "Хранитель", как он выглядит и реализуется и уверено можете определить, что им не является, и даже ссылками кидаетесь с примерами кода, то что именно вы спрашиваете?))))))))))))))) Или в википедии реализация тоже не достаточно реализационная?))))
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
29.06.2017, 14:52  [ТС]
Usaga, я не понял, мне нужно объяснять почему ваш ответ не отвечает на поставленный вопрос в теме? Зачем мне это? Зачем ВАМ это? Вы высказались, вас услышали.
0
Эксперт .NET
 Аватар для Usaga
14357 / 9458 / 1360
Регистрация: 21.01.2016
Сообщений: 35,669
29.06.2017, 16:27
skilllab, я так и не смог понять, что вам надо. Видимо мне это не дано.
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
29.06.2017, 17:04
Кликните здесь для просмотра всего текста
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
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
29.06.2017, 18:11  [ТС]
Цитата Сообщение от Cupko Посмотреть сообщение
private readonly string state;
тут кроется засада
------------------
Уточняю тематический вопрос: можно ли использовать паттерн Хранитель с ссылочным mutable типом?
Если можно, то как реализовать паттерн? Тут подразумевается не сериализация типа или его клонирование, а как этот тип используется в коде паттерна. Т.е. пример использования.
Если нельзя - то тогда ладно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.06.2017, 18:11

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru