Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Паттерны, не до конца понимаю итератор и одиночку


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


Использовать шаблон проектирования « Одиночка » ( 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;
        }
    }
}

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

Автор: Certain 27.1.2014, 16:37
Как-то так...
Код

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();
        }
    }



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)