Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Паттерны, не до конца понимаю итератор и одиночку 
:(
    Опции темы
oxana1234
Дата 26.1.2014, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пожалуйста, помогите, никак не могу осилить паттерны, немного задачи с горем пополам сделала, а дальше ступор. Спасибо за любую помощь!


Использовать шаблон проектирования « Одиночка » ( Singleton ) для описания класса « Дед Мороз» , шаблон проектирования «Абстрактная фабрика» ( Abstract Factory ) для описания создания подарков ( abstract / concrete product ) на фабриках ( abstract / concrete factory ) и шаблон проектирования « Итератор » ( Iterator ) для организации последовательного обращения к списку детей и назначенных им фабрик
Код

using System;
using System.Collections;
 
 
namespace DesignPatterns.Creational
{
    class program
    {
        static void Main()
        {
            ConcreteAggregate a = new ConcreteAggregate();
            a[0] = "Julia";
            a[1] = "Marta";
            a[2] = "Natalka";
            a[3] = "Svitlana";
 
            ConcreteIterator i = new ConcreteIterator(a);
 
 
        }
        // abstract factory
        // абстракна фабрика
        public interface IToyFactory
        {
            Edible GetEdible();
            InEdible GetInEdible();
        }
        
        // concrete factory
        // конкретна фабрика
        public class Goog_factory : IToyFactory
        {
            public Edible GetEdible()
            {
                return new cake();
            }
            public InEdible GetInEdible()
            {
                return new toy();
            }
        }
        // concrete factory
        // конкретна фабрика
        public class Bad_factory : IToyFactory
        {
            public Edible GetEdible()
            {
                return new pill();
            }
            public InEdible GetInEdible()
            {
                return new rod();
            }
        }
 
        public abstract class AnimalToy
        {
            protected AnimalToy(string name)
            {
                Name = name;
            }
            public string Name { get; private set; }
        }
        public abstract class InEdible : AnimalToy
        {
            protected InEdible(string name) : base(name) { }
        }
        public abstract class Edible : AnimalToy
        {
            protected Edible(string name) : base(name) { }
        }
        class cake : Edible
        {
            public cake() : base("cake") { }
        }
        class rod : InEdible
        {
            public rod() : base("rod") { }
        }
        class  pill : Edible
        {
            public pill() : base("pill") { }
        }
        class toy : InEdible
        {
            public toy() : base("toy") { }
        }
 
        public class AbstractFactoryDemo
        {
            public static void Run()
            {
                RunGoodFactory();
                RunBadFactory();
            }
 
            private static void RunBadFactory()
            {
                // lets start with wooden factory
                // спочатку створимо дерев'яну фабрику
                IToyFactory toyFactory = new Bad_factory();
 
                InEdible _rod = toyFactory.GetInEdible();
                Edible _pill = toyFactory.GetEdible();
                Console.WriteLine("I've got {0} and {1}", _rod.Name, _pill.Name);
                // Output/Вивід: [I've got Wooden Bear and Wooden Cat]
            }
 
            private static void RunGoodFactory()
            {
                // and now teddy one
                // а тепер плюшеву
                IToyFactory toyFactory = new Goog_factory();
 
                InEdible _toy = toyFactory.GetInEdible();
                Edible _cake = toyFactory.GetEdible();
                Console.WriteLine("I've got {0} and {1}", _toy.Name, _cake.Name);
                // Output/Вивід: [I've got Teddy Bear and Teddy Cat]
            }
        }
    }
 
    abstract class Aggregate
    {
        public abstract Iterator CreateIterator();
        public abstract int Count { get; protected set; }
        public abstract object this[int index] { get; set; }
    }
 
    /// <summary>
    /// The 'ConcreteAggregate' class
    /// </summary>
    class ConcreteAggregate : Aggregate
    {
        private readonly ArrayList _items = new ArrayList();
 
        public override Iterator CreateIterator()
        {
            return new ConcreteIterator(this);
        }
 
        // Gets item count
        public override int Count
        {
            get { return _items.Count; }
            protected set { }
        }
 
        // Indexer
        public override object this[int index]
        {
            get { return _items[index]; }
            set { _items.Insert(index, value); }
        }
    }
 
    /// <summary>
    /// The 'Iterator' abstract class
    /// </summary>
    abstract class Iterator
    {
        public abstract object First();
        public abstract object Next();
        public abstract bool IsDone();
        public abstract object CurrentItem();
    }
 
    /// <summary>
    /// The 'ConcreteIterator' class
    /// </summary>
    class ConcreteIterator : Iterator
    {
        private readonly Aggregate _aggregate;
        private int _current;
 
        // Constructor
        public ConcreteIterator(Aggregate aggregate)
        {
            this._aggregate = aggregate;
        }
 
        // Gets first iteration item
        public override object First()
        {
            return _aggregate[0];
        }
 
        // Gets next iteration item
        public override object Next()
        {
            object ret = null;
            if (_current < _aggregate.Count - 1)
            {
                ret = _aggregate[++_current];
            }
 
            return ret;
        }
 
        // Gets current iteration item
        public override object CurrentItem()
        {
            return _aggregate[_current];
        }
 
        // Gets whether iterations are complete
        public override bool IsDone()
        {
            return _current >= _aggregate.Count;
        }
    }
}

А это задание : В этом году « Деду Морозу » помогает « Фабрика добрых
подарков »и« Фабрика плохих подарков » , каждая из которых создает один съедобный и один несъедобный подарок (методы абстрактной фабрики и абстрактные продукты соответственно) . Для того , чтобы получить подарок , дети присылают
сообщение в виде двух цифр : количества хороших и плохих поступков , которые они совершили за последний год. «Дед Мороз» собирает сообщения от детей и решает , отправить ребенку хороший или плохой подарок в зависимости от того, каких поступков больше ( хороших или плохих ) - назначает каждому ребенку в списке соответствующую конкретную фабрику.
PM MAIL   Вверх
Certain
Дата 27.1.2014, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Как-то так...
Код

class program
    {
        static void Main()
        {
            Child[] children = new Child[4];
            children[0] = new Child("Александр", 5, 3);
            children[1] = new Child("Марина", 8, 4);
            children[2] = new Child("Михаил", 4, 9);
            children[3] = new Child("Юлия", 7, 9);

            Santa santa = Santa.Get();

            //паттерн "итератор" уже реализован всеми коллекциями и 
            //массивами в .NET (интерфейс IEnumerator и обобщённая версия)
            IEnumerator enumerator = children.GetEnumerator();
            enumerator.Reset();
            while (enumerator.MoveNext())
            {
                Child child = (Child)enumerator.Current;

                //Санта назначает соответствующую фабрику (идиома Простая фабрика)
                santa.SetFactory(child);

                //Выводим
                Console.WriteLine("Child name:" + child.Name);
                GiftFactory factory = child.Factory;

                Eatable eatable = factory.CreateEatable();
                Console.WriteLine("Eat:" + eatable.Eat());

                Uneatable uneatable = factory.CreateUneatable();
                Console.WriteLine("Use:" + uneatable.Use());
                Console.WriteLine("---------------------------" + Environment.NewLine);
            }

            Console.ReadLine();
        }
    }




Это сообщение отредактировал(а) Certain - 28.1.2014, 11:51

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  patterns.rar 20,73 Kb
--------------------
Работа программиста и шамана имеет много общего - оба боpмочyт непонятные слова, совершают непонятные действия и не могут объяснить, как оно работает.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

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


 




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


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

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