Шаблонный метод (Template Method) — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Admin (обсуждение | вклад) (→Другое название) |
Admin (обсуждение | вклад) (→Участники) |
||
(не показано 7 промежуточных версий этого же участника) | |||
Строка 2: | Строка 2: | ||
__NOTOC__ | __NOTOC__ | ||
=== Назначение === | === Назначение === | ||
+ | Определяет каркас алгоритма с изменяющимися областями и позволяет наследникам переопределять эти области. | ||
=== Описание === | === Описание === | ||
+ | В ряде видов приложений обычно имеется общий каркас (шаблон), состоящий из нескольких взаимосвязанных классов, объекты которых друг с другом взаимодействуют. Для конкретных потребностей можно породить подклассы этих классов, переопределив в них ряд методов и обеспечив тем самым вариабельность на основе данного каркаса. | ||
+ | |||
+ | Каркас изменить невозможно. Классы-потомки позволяют локализовать в себе новое поведение. | ||
=== Реализация === | === Реализация === | ||
==== Диаграмма классов ==== | ==== Диаграмма классов ==== | ||
− | [[Изображение: | + | [[Изображение: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
Назначение
Определяет каркас алгоритма с изменяющимися областями и позволяет наследникам переопределять эти области.
Описание
В ряде видов приложений обычно имеется общий каркас (шаблон), состоящий из нескольких взаимосвязанных классов, объекты которых друг с другом взаимодействуют. Для конкретных потребностей можно породить подклассы этих классов, переопределив в них ряд методов и обеспечив тем самым вариабельность на основе данного каркаса.
Каркас изменить невозможно. Классы-потомки позволяют локализовать в себе новое поведение.
Реализация
Диаграмма классов
Участники
- 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();
}
}
Достоинства и недостатки
- Паттерн способствует повторному использованию кода.
- Паттерн позволяет создать каркас приложения, для использования которого в заданной предметной области достаточно переопределить несколько методов.
- Если базовый метод вызывает слишком много абстрактных методов, которые надо переопределять, то использование паттерна становится неудобно
Варианты
- Абстрактный класс реализует часть методов, предоставляя реализацию по умолчанию.