Поиск по этому блогу

четверг, 19 апреля 2012 г.

Шаблон проектирования

На одном сайте нашёл вот такой интересный проект. На примере Макдональдса показывается как нужно конструировать программу.
На таких примерах и стараюсь нацчиться программировать)))
Цитата с того сайта.
А теперь, чтобы лучше понять суть паттерна Builder, рассмотрим практический пример, в котором вы будете собирать объект HappyMeal — знаменитый детский набор, предлагаемый в сети закусочных McDonald’s. В первом случае вы соберете бюджетный вариант HappyMeal (маленькая порция пепси-колы, гамбургер, картошка и игрушка), а во втором — BigHappyMeal (гамбургер вы замените на бигмак и увеличите порцию напитка).
И сам код программы:

class HappyMeal
 
  {
 
    // содержит информацию о  составе HappyMeal
 
    ArrayList parts = new ArrayList();
 
    // Добавляете информацию  о новой составной части
 
    public void Add(string part)
 
    {
 
      parts.Add(part);
 
    }
 
    // Выводите информацию о  всем наборе
 
    public void Show()
 
    {
 
      Console.WriteLine(" Happy Meal Parts ——-");
 
      foreach (string part in parts)
 
      Console.WriteLine (part);
 
    }
 
  }




Так как у меня возникли некоторые проблемы с реализацией ArrayList, я использовал List<T>. В итоге эта часть кода получилась такой:

class HappyMeal
    {
        ///Содержит информацию о составе HappyMeal
        List<string> parts = new List<string>();
        // Добавляем информацию  о новой составной части
        public void Add(string part) 
        {
            parts.Add(part);
        }
        // Выводим информацию о  всем наборе
        public void Show() 
        {
            Console.WriteLine("HappyMeal parts ----");
            foreach (string part in parts)
                Console.WriteLine(part);
        }
    }

Дальше ничего не менял в коде.


// "Конструктор - интерфейс для создания объекта HappyMeal по частям"
 
  abstract class HappyMealBuilder
 
  {    
 
    public abstract void BuildBurger();
 
    public abstract void BuildPepsi();
 
    public abstract void BuildFries();    
 
    public abstract void BuildToy();
 
    public abstract HappyMeal GetProduct();
 
  }

Теперь реализуем  конструктор, создающий большой HappyMeal:


// Конструктор для большого HappyMeal
 
  class BigHappyMealBuilder : HappyMealBuilder
 
  {
 
    private HappyMeal happy_meal = new HappyMeal();
 
    public override void BuildBurger()
 
    {
 
      happy_meal.Add("BigMac");
 
    }
 
    public override void BuildPepsi()
 
    {
 
      happy_meal.Add("Pepsi 0.7");
 
    }
 
    public override void BuildFries()
 
    {
 
      happy_meal.Add("BigFries");
 
    }
 
    public override void BuildToy()
 
    {
 
      happy_meal.Add("Two toys");
 
    }
 
    public override HappyMeal GetProduct()
 
    {
 
      return happy_meal;
 
    }
 
  }

С маленьким HappyMeal точно также всё делается


// Конструктор для маленького  HappyMeal
 
  class SmallHappyMealBuilder : HappyMealBuilder
 
 {
 
    private HappyMeal happy_meal = new HappyMeal();
 
    public override void BuildBurger()
 
   {
 
      happy_meal.Add("Hamburger");
 
   }
 
    public override void BuildPepsi()
 
   {
 
      happy_meal.Add("Pepsi 0.3");
 
   }
 
    public override void BuildFries()
 
   {
 
      happy_meal.Add("SmallFries");
 
   }
 
    public override void BuildToy()
 
   {
 
      happy_meal.Add("One toy");
 
   }
 
    public override HappyMeal GetProduct()
 
   {
 
     return happy_meal;
 
    }
 
  }

Пришло время реализовать класс Director, который будет отвечать за конструирование объектов:


// "Этот класс будет  заниматься конструированием"
 
  class Director
 
  {
 
    // Конструирование объекта по частям
 
    public void Construct(HappyMealBuilder builder)
 
   {
 
      builder.BuildBurger();
 
      builder.BuildPepsi();
 
      builder.BuildFries();
 
      builder.BuildToy();
 
    }
 
  }

А теперь всё реализуем)


      // Создаете класс Director и строителей для двух наборов HappyMeal
 
      Director director = new Director();
 
      HappyMealBuilder big_hmbuilder = new BigHappyMealBuilder();
 
      HappyMealBuilder small_hmbuilder = new SmallHappyMealBuilder();
 
      // Конструируете два продукта
 
      director.Construct(big_hmbuilder);
 
      HappyMeal hm1 = big_hmbuilder.GetProduct();
 
      hm1.Show();
 
      director.Construct(small_hmbuilder);
 
      HappyMeal hm2 = small_hmbuilder.GetProduct();
 
      hm2.Show();
 
      // Ожидаете действия пользователя
 
      Console.Read();

Комментариев нет:

Отправить комментарий