Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Вопрос про Шаблон проектирования / 24 сообщений из 24, страница 1 из 1
08.05.2013, 10:59
    #38251390
sergei123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
Здравствуйте

Могли бы вы определить если данный код(написанный мной) на c# может относится к какому ту шаблону проектирования(design pattern)?

Код: 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.
public class main {
        static void Main()
        {
                User user = new User();
                user.add( new A() );        // add A to A data
                user.add( new B() );        // add B to B data
        }
}

public class User 
{
        public void User()
        {
        ... 
        }
        public void add(UinClass x)
        {
                x.add();
        }
}

public abstract class UinClass
{
        {
                public abstract void add();
        }
}

public class A : UinClass
{
        public override void add() 
        {
                 // add A to A data
        }
}

public class B : UinClass
{
        public override void add() 
        {
                 // add B to B data
        }
}



Цель кода, позволить юзеру давать приказы на выполнения команд не имея к ним отношения.
...
Рейтинг: 0 / 0
08.05.2013, 11:08
    #38251400
sergei123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
public void User()
public User()
...
Рейтинг: 0 / 0
08.05.2013, 12:17
    #38251561
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
sergei123,

очень похоже на proxy
...
Рейтинг: 0 / 0
08.05.2013, 12:55
    #38251640
skole
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
Это паттерн "Strategy", когда вы можете формулировать различные команды классу, в том числе в зависимости от типа, в этом случае следует добавить enumerator и кинуть его в Dictionary, тогда уже можно реализовать не только ход выполнения, но и поведение, как в шаблоне "Visitor"
...
Рейтинг: 0 / 0
08.05.2013, 17:20
    #38252141
sergei123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
skole, не совсем понял про enumerator в Dictionary. Можете привести пример?
...
Рейтинг: 0 / 0
08.05.2013, 21:27
    #38252388
skole
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования


Код: 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.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
namespace ExampleConApp
{
    internal class Program
    {
        private static void Main()
        {
            var inputClass = new InputClass { ItemType = ItemType.Read, Query = "QueryTextToBeRun" };

            Console.WriteLine(
                "{0} - Status: {1}", inputClass.Query, Enum.Parse(typeof(ItemType), inputClass.ItemType.ToString()));

            var ei = new ExampleImplementation();

            inputClass = ei.VisitExample(inputClass);
            Console.WriteLine(
                "{0} - Status: {1}", inputClass.Query, Enum.Parse(typeof(ItemType), inputClass.ItemType.ToString()));

            ei.VisitExample(inputClass);
            Console.WriteLine(
                "{0} - Status: {1}", inputClass.Query, Enum.Parse(typeof(ItemType), inputClass.ItemType.ToString()));

            Console.Read();
        }
    }

    public enum ItemType
    {
        Read,

        Write
    }

    public class InputClass
    {
        public ItemType ItemType { get; set; }

        public string Query { get; set; }
    }

    public abstract class ExampleBase
    {
        private Dictionary<ItemType, Func<InputClass, InputClass>> _itemActions;

        protected Dictionary<ItemType, Func<InputClass, InputClass>> ItemActions
        {
            get
            {
                return _itemActions
                       ??
                       (_itemActions =
                        new Dictionary<ItemType, Func<InputClass, InputClass>>
                            { { ItemType.Read, ReadItem }, { ItemType.Write, WriteItem } });
            }
        }

        protected abstract InputClass ReadItem(InputClass inputClass);

        protected abstract InputClass WriteItem(InputClass inputClass);
    }

    public class ExampleImplementation : ExampleBase
    {
        public InputClass VisitExample(InputClass inputClass)
        {
            return inputClass == null ? null : ItemActions[inputClass.ItemType].Invoke(inputClass);
        }

        protected override InputClass ReadItem(InputClass inputClass)
        {
            //Implementation: inputClass = DoSomething();
            inputClass.Query = "QueryHasBeenWrite";
            inputClass.ItemType = ItemType.Write;
            return inputClass;
        }

        protected override InputClass WriteItem(InputClass inputClass)
        {
            //Implementation: inputClass = DoSomething();
            inputClass.Query = "QueryHasBeenRead";
            inputClass.ItemType = ItemType.Read;
            return inputClass;
        }
    }
}



...
Рейтинг: 0 / 0
08.05.2013, 21:29
    #38252390
WPF
WPF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
Здесь видно, как класс в зависимости от типа по разному отрабатывается, надеюсь, разберешься.
...
Рейтинг: 0 / 0
09.05.2013, 00:05
    #38252456
sergei123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
Спасибо, немного сложно попытаюсь разобраться.
...
Рейтинг: 0 / 0
09.05.2013, 03:31
    #38252501
WPF
WPF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
Сделай пару своих примеров, станет понятней. Такой код в книжках не пишут, это уже практический опыт, применяем полиморфизм везде, где мы сомневаемся, чтобы не ловить исключения, не фильтровать момент истины if-ами, ну и как следствие безотказный функционал с защитой от дурака и уважение в глазах коллег по цеху.
...
Рейтинг: 0 / 0
13.05.2013, 11:14
    #38254927
sergei123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
skole, если честно запутался в вашем коде. Мне интересно как можно реализовать метод get для всех классов на основе паттерна Strategy?

Код: 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.
namespace Project1
{
    public interface Object
    {
        void add();
        void update();
        ? get(int);
    }
}

namespace Project
{
    class ClassType1 : Object
    {    
        public ClassType1(params)
        {

        }

        public void add()
        {
            // add action, добавляет this в БД
        }

        public void update()
        {
            // update action, делает апдейт на this
        }

        public ClassType1 get(int id)
        {
            // return an object of ClassType1, возвращает из БД объект где id=
        }
    }
}

namespace Project
{
    class ClassType2: Object
    {    
        public ClassType2(params)
        {

        }

        public void add()
        {
            // add action, добавляет this в БД
        }

        public void update()
        {
            // update action, делает апдейт на this
        }

        public ClassType2 get(int id)
        {
            // return an object of ClassType1, возвращает из БД объект где id=
        }
    }
}
...
Рейтинг: 0 / 0
13.05.2013, 15:02
    #38255312
skole
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
Понимаю, прыгать через ступеньку не просто, я тебе сел и написал самый простой пример, только логику. Это «Visitor», но он сильно связан подходом со «Startegy», только «Visitor» статический шаблон, в случае со «Startegy», ты динамично, в зависимости от логики приложения, формируешь логику выполнения.
В основе все тот же полиморфизм, пришел класс на вход, приложение динамично генерирует сценарий выполнения операций для данного класса и отправляет на выполнение, это «Startegy».
Выброси книжку, попытайся сам понять, как ты будешь строить логику для разных типов классов, вызывающих твой код.
...
Рейтинг: 0 / 0
13.05.2013, 15:44
    #38255358
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
sergei123,

похоже на слушателя.
...
Рейтинг: 0 / 0
13.05.2013, 16:17
    #38255415
skole
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
ZyK_BotaN, ты тоже внимательно читай, а то только и будешь всю жизнь лабы писать.
...
Рейтинг: 0 / 0
15.05.2013, 10:17
    #38257675
sergei123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
К сожалению visitor не решит полностью мою задачу, нужно чтобы один или несколько методов могли возвращать разные типы. В общем для этого предусмотрен factory pattern но не нашел подходящий алгоритм для этого.

По гуглил, нашел вот такое:
Код: c#
1.
2.
3.
4.
    public T get<T>() where T : new()
    {
          return new T();
    }



Мне нужно так:
Код: 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.
public interface Object 
    {
         get();
    }

public class A : Object
    {
          A get() { return A }
    }

public class B : Object
    {
          B get() { return A }
    }

public class Client
    {
          public static T get<T>(T obj) where T : new()
         {
                 return T.get();
          }
    }

public class Program
    {
          public void main()
          {
                A a = Object<A>.get(new A(null,"Василий","Петров",null)); // пример возвращает найденный A(123456789,"Василий","Петров"","Юрист")
                B b = Object<B>.get(new B(777777777,null,null)); // пример возвращает найденный B(777777777,"телевизор","JVC")
    }



Как это сделать?
...
Рейтинг: 0 / 0
15.05.2013, 10:20
    #38257683
sergei123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
A a = Object<A>.get(new A(null,"Василий","Петров",null)); // пример возвращает найденный A(123456789,"Василий","Петров"","Юрист")
B b = Object<B>.get(new B(777777777,null,null)); // пример возвращает найденный B(777777777,"телевизор","JVC")
Код: c#
1.
2.
A a = Client.get(new A(null,"Василий","Петров",null)); // пример возвращает найденный A(123456789,"Василий","Петров"","Юрист")
B b = Client.get(new B(777777777,null,null)); // пример возвращает найденный B(777777777,"телевизор","JVC")
...
Рейтинг: 0 / 0
16.05.2013, 08:20
    #38259560
WPF
WPF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
Factory вполне подходит для твоей задачи. Для Factory нужно соблюдать 2 условия, 1-е, все классы должны имплементировать общий интерфейс или абстрактный класс. Интерфейс предпочтительней в логике, абстрактный класс в методах доступа. В твоем случае лучше интерфейс, например IPerson Person get;set;
2-е условие использование типа интерфейса при вызове, например, IPerson person = new Client(); или IPerson person = Worker.get(new Person)

То есть, как ты написал не получиться, пока ты не приведешь класс «A» и «B» к единому интерфейсу.
...
Рейтинг: 0 / 0
16.05.2013, 08:27
    #38259563
WPF
WPF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
А прости, не обратил внимание, что у тебя уже есть общий интерфейс, ну, тогда все условия соблюдены.
...
Рейтинг: 0 / 0
16.05.2013, 08:28
    #38259566
WPF
WPF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
Тогда, следовательно, Client тоже должен наследовать этот интерфейс.
...
Рейтинг: 0 / 0
16.05.2013, 08:55
    #38259590
sergei123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
Спасибо разобрался как все сделать. Вопрос, а можно ли считать что тут реализованы два паттерна, strategy и factory? при условии что class Client тоже наследует interface Object.
...
Рейтинг: 0 / 0
16.05.2013, 09:17
    #38259604
WPF
WPF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
Конечно нет, это две разные концепции.
...
Рейтинг: 0 / 0
16.05.2013, 09:22
    #38259612
WPF
WPF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
«Strategy» это набор методов. Представь, в твою программу приходят текстовые сообщения, которые надо парсить по разному. У тебя несколько методов парсера, с приходом каждого сообщения, ты определяешь тип и собираешь в коллекцию набор методов парсера, которые необходимо провести. Вот и все, прога сама разбирает тип и генерирует сценарий команд, которые позже, например в другом потоке парсяться согласно сценарию.
...
Рейтинг: 0 / 0
16.05.2013, 09:24
    #38259613
WPF
WPF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
Разумеется «Strategy» можно применить и к «Factory», но в «Factory» для этого предназначен интерфейс. Так например сделан Entity Framework
...
Рейтинг: 0 / 0
16.05.2013, 10:52
    #38259777
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
sergei123Здравствуйте

Могли бы вы определить если данный код(написанный мной) на c# может относится к какому ту шаблону проектирования(design pattern)?

Код: 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.
public class main {
        static void Main()
        {
                User user = new User();
                user.add( new A() );        // add A to A data
                user.add( new B() );        // add B to B data
        }
}

public class User 
{
        public void User()
        {
        ... 
        }
        public void add(UinClass x)
        {
                x.add();
        }
}

public abstract class UinClass
{
        {
                public abstract void add();
        }
}

public class A : UinClass
{
        public override void add() 
        {
                 // add A to A data
        }
}

public class B : UinClass
{
        public override void add() 
        {
                 // add B to B data
        }
}



Цель кода, позволить юзеру давать приказы на выполнения команд не имея к ним отношения.

Ты лучше словами сформулируйте, что от класса надо, чем какой то непонятный код постить.
...
Рейтинг: 0 / 0
16.05.2013, 10:55
    #38259786
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про Шаблон проектирования
UinClass и A , B — это бридж, bridge, он же interface.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Вопрос про Шаблон проектирования / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]