Decorator Pattern

Zastosowanie wzorca Decorator na przykładzie produktu i ofert specjalnych.
Wzorzec ten pozwala nam na dynamiczną zmianę/rozszerzanie zachowania istniejących klas.

    public abstract class Item
    {
        public abstract int Id { get; set; }

        public abstract string Name { get; set; }

        public abstract decimal Price { get; set; }
    }

Klasa Product dziedziczy z naszej abstrakcyjnej klasy Item.

    public class Product : Item
    {
        public override int Id { get; set; }

        public override string Name { get; set; }

        public override decimal Price { get; set; }
    }

Definicja abstrakcyjnej klasy dekoratora dla typu Item, wraz z implementacją wyliczenia nowej ceny dla produktu.

    public abstract class ProductDecoratorBase : Item
    {
        private readonly Item _item;

        public decimal Discount { get; protected set; }

        public ProductDecoratorBase(Item item)
        {
            _item = item;
        }

        public override int Id
        {
            get
            {
                return _item.Id;
            }
            set
            {
                _item.Id = value;
            }
        }

        public override string Name
        {
            get
            {
                return _item.Name;
            }
            set
            {
                _item.Name = value;
            }
        }

        public override decimal Price
        {
            get
            {
                var newPrice = _item.Price - Discount;

                return newPrice < 0 ? 0 : newPrice;
            }
            set
            {
                _item.Price = value;
            }
        }
    }

Definicja klasy SpecialOffer na bazie naszego dekoratora z promocyjnym upustem w wysokości 500zł.

    public class SpecialOffer : ProductDecoratorBase
    {       
        public SpecialOffer(Item product) : base(product)
        {
            Discount = 500;   
        }               
    }

Definicja klasy WeekendSpecialOffer na bazie naszego dekoratora z promocyjnym upustem w wysokości 750zł.

    public class WeekendSpecialOffer : ProductDecoratorBase
    {        
        public WeekendSpecialOffer(Item item) : base(item) 
        {
            Discount = 750;
        }
    }

Poniżej przykład zastosowania zaimplementowanego wzorca.

    class Program
    {
        static void Main(string[] args)
        {
            //Decorator
            Item laptop = new Product { Id = 1, Name = "Laptop", Price = 2545M };

            SpecialOffer specialOfferForMouse = new SpecialOffer(laptop);
            Console.WriteLine("Special price {0}", specialOfferForMouse.Price);

            WeekendSpecialOffer weekendOffer = new WeekendSpecialOffer(laptop);
            Console.WriteLine("Special weekend price {0}", weekendOffer.Price);

            Console.WriteLine("Original price {0}", laptop.Price);
        }
    }

Wynik działania aplikacji:

Advertisements

2 thoughts on “Decorator Pattern

  1. Bardzo mi się podoba, krótko i treściwie. Mam pytanie? Jaka to skórka w blogu (ja mam odcień niebieski, a czarny mi się bardziej podoba)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s