Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы / Лабораторная работа 3 / ПКРПСиБД LAB3 Моисеев Н.А..docx
Скачиваний:
21
Добавлен:
28.06.2014
Размер:
146.26 Кб
Скачать

Диаграмма классов

Строитель

Описание

Отделяет конструирование сложного объекта от его представления, так что в результате одного и того же процесса конструирования могут получаться разные представления.

Преимущества

  • Позволяет изменять внутреннее представление продукта;

  • Изолирует код, реализующий конструирование и представление;

  • Дает более тонкий контроль над процессом конструирования.

Недостатки

  • Данный шаблон не скрывает реализацию порождаемых объектов, а создает то, что требуется;

  • Как следствие, результатом работы могут быть объекты, не связанные явно между собой. Как правило, у них единые цели, но не обязательно есть общие интерфейсы, базовые классы и т.д.

Детали реализации

public interface IPageBuilder

{

void BuildHeader(HeaderData header);

void BuildMenu(MenuItems items);

void BuildPost(PostData post);

void BuildFooter(FooterData footer);

}

public class PageDirector

{

private readonly IPageBuilder _builder;

private static HeaderData GetHeader(int pageId) { return new HeaderData(pageId); }

private static MenuItems GetMenuItems(int pageId) { return new MenuItems(pageId); }

private static IEnumerable<PostData> GetPosts(int pageId)

{

return new List<PostData>

{

new PostData(pageId),

new PostData(pageId)

};

}

private static FooterData GetFooter(int pageId) { return new FooterData(pageId); }

public PageDirector(IPageBuilder builder)

{

_builder = builder;

}

public void BuildPage(int pageId)

{

_builder.BuildHeader(GetHeader(pageId));

_builder.BuildMenu(GetMenuItems(pageId));

foreach (var post in GetPosts(pageId))

{

_builder.BuildPost(post);

}

_builder.BuildFooter(GetFooter(pageId));

}

}

public class PageBuilder : IPageBuilder

{

private readonly Page _page = new Page();

public void BuildHeader(HeaderData header) { _page.AddHeader(header); }

public void BuildMenu(MenuItems menuItems) { _page.SetMenuItems(menuItems); }

public void BuildPost(PostData post) { _page.AddPost(post); }

public void BuildFooter(FooterData footer) { _page.AddFooter(footer); }

public Page GetResult() { return _page; }

}

public class PrintPageBuilder : IPageBuilder

{

private readonly Page _page = new Page();

private static PostData PreparePostToPrinter(Data.Data post)

{

return new PostData { Text = "PrintPost" + post.Text.Last() };

}

public void BuildHeader(HeaderData header) { }

public void BuildMenu(MenuItems menuItems) { }

public void BuildPost(PostData post)

{

var postToPrint = PreparePostToPrinter(post);

_page.AddPost(postToPrint);

}

public void BuildFooter(FooterData footer) { }

public Page GetResult() { return _page; }

}

class Program

{

static void Main(string[] args)

{

var pageBuilder = new PageBuilder();

new PageDirector(pageBuilder).BuildPage(1);

var page = pageBuilder.GetResult();

Post(page);

Console.WriteLine();

Console.WriteLine();

var pageBuilder2 = new PrintPageBuilder();

new PageDirector(pageBuilder2).BuildPage(2);

var page2 = pageBuilder2.GetResult();

Post(page2);

Console.ReadKey();

}

private static void Post(Page page)

{

page.Print();

}

}

Соседние файлы в папке Лабораторная работа 3