Шаблонный метод (Template Method) — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Новая страница: « К основной странице курса __NOTOC__ === Другое назв…»)
 
(Участники)
 
(не показано 8 промежуточных версий этого же участника)
Строка 1: Строка 1:
 
[[Страница_курса_Паттерны_проектирования| К основной странице курса]]
 
[[Страница_курса_Паттерны_проектирования| К основной странице курса]]
 
__NOTOC__
 
__NOTOC__
=== Другое название ===
 
 
=== Назначение ===
 
=== Назначение ===
 +
Определяет каркас алгоритма с изменяющимися областями и позволяет наследникам переопределять эти области.
  
 
=== Описание ===
 
=== Описание ===
 +
В ряде видов приложений обычно имеется общий каркас (шаблон), состоящий из нескольких взаимосвязанных классов, объекты которых друг с другом взаимодействуют. Для конкретных потребностей можно породить подклассы этих классов, переопределив в них ряд методов и обеспечив тем самым вариабельность на основе данного каркаса.
 +
 +
Каркас изменить невозможно. Классы-потомки позволяют локализовать в себе новое поведение.
  
 
=== Реализация ===
 
=== Реализация ===
 
==== Диаграмма классов ====
 
==== Диаграмма классов ====
[[Изображение:Common.png]]
+
[[Изображение:TemplateCommon.png]]
  
 
==== Участники====
 
==== Участники====
*  
+
* '''AbstractClass''' - абстрактный класс.
 +
Содержит шаблонный метод, реализованный в виде вызовов ряда абстрактных методов, определенных в этом же классе.
 +
* '''ConcreteClass''' - конкретный класс.
 +
Расширяет AbstractClass, переопределяя его абстрактные методы.
  
 
=== Пример ===
 
=== Пример ===
 
<source lang="Csharp">
 
<source lang="Csharp">
 +
using System;
 +
 +
abstract class AbstractClass
 +
{
 +
  public abstract void Method1();
 +
  public abstract void Method2();
 +
  public abstract void Method3();
 +
  public void TemplateMethod()
 +
  {
 +
    Method1();
 +
    Method2();
 +
    Method3();
 +
  }
 +
}
 +
 +
class ConcreteClass: AbstractClass
 +
{
 +
  public override void Method1()
 +
  {
 +
    Console.WriteLine("Sleep");
 +
  }
 +
  public override void Method2()
 +
  {
 +
    Console.WriteLine("Think");
 +
  }
 +
  public override void Method3()
 +
  {
 +
    Console.WriteLine("Eat");
 +
  }
 +
}
 +
 +
class My
 +
{
 +
  static void Main()
 +
  {
 +
    var c = new ConcreteClass();
 +
    c.TemplateMethod();
 +
  }
 +
}
 
</source>
 
</source>
  
 
=== Достоинства и недостатки ===
 
=== Достоинства и недостатки ===
*  
+
* Паттерн способствует повторному использованию кода.
 +
* Паттерн позволяет создать каркас приложения, для использования которого в заданной предметной области достаточно переопределить несколько методов.
 +
* Если базовый метод вызывает слишком много абстрактных методов, которые надо переопределять, то использование паттерна становится неудобно
  
 
=== Варианты ===
 
=== Варианты ===
*
+
*Абстрактный класс реализует часть методов, предоставляя реализацию по умолчанию.

Текущая версия на 20:35, 31 июля 2014

К основной странице курса

Назначение

Определяет каркас алгоритма с изменяющимися областями и позволяет наследникам переопределять эти области.

Описание

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

Каркас изменить невозможно. Классы-потомки позволяют локализовать в себе новое поведение.

Реализация

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

TemplateCommon.png

Участники

  • AbstractClass - абстрактный класс.

Содержит шаблонный метод, реализованный в виде вызовов ряда абстрактных методов, определенных в этом же классе.

  • ConcreteClass - конкретный класс.

Расширяет AbstractClass, переопределяя его абстрактные методы.

Пример

using System;

abstract class AbstractClass
{
  public abstract void Method1();
  public abstract void Method2();
  public abstract void Method3();
  public void TemplateMethod()
  {
    Method1();
    Method2();
    Method3();
  }
}

class ConcreteClass: AbstractClass
{
  public override void Method1()
  {
    Console.WriteLine("Sleep");
  }
  public override void Method2()
  {
    Console.WriteLine("Think");
  }
  public override void Method3()
  {
    Console.WriteLine("Eat");
  }
}

class My
{
  static void Main()
  {
    var c = new ConcreteClass();
    c.TemplateMethod();
  }
}

Достоинства и недостатки

  • Паттерн способствует повторному использованию кода.
  • Паттерн позволяет создать каркас приложения, для использования которого в заданной предметной области достаточно переопределить несколько методов.
  • Если базовый метод вызывает слишком много абстрактных методов, которые надо переопределять, то использование паттерна становится неудобно

Варианты

  • Абстрактный класс реализует часть методов, предоставляя реализацию по умолчанию.