Участник:Joparino/Шаблон невиртуального интерфейса
Шаблон невиртуального интерфейса (англ. non-virtual interface pattern, NVI) управляет переопределением методов в базовом классе. Такие методы могут вызываться клиентами и переопределяемыми методами с основной функциональностью[1]. Этот шаблон тесно связан с шаблонным методом. Шаблон невиртуального интерфейса признает преимущества неабстрактного метода, вызывающего подчиненные абстрактные методы. Этот уровень косвенности позволяет выполнять операции до и после относительно абстрактных операций как непосредственно, так и с будущими непредвиденными изменениями. Шаблон невиртуального интерфейса может быть развернут с очень небольшими затратами на производство программного обеспечения и время выполнения. Многие коммерческие программные фреймворки используют шаблон невиртуального интерфейса.
Преимущества и недостатки
Дизайн, который придерживается этого шаблона, приводит к разделению интерфейса класса на два отдельных интерфейса:
- Клиентский интерфейс: Это общедоступный невиртуальный интерфейс
- Интерфейс подкласса: Это частный интерфейс, который может иметь любую комбинацию виртуальных и невиртуальных методов.
С такой структурой проблема хрупкого базового класса смягчается. Единственным недостатком является то, что код немного увеличен[2].
Пример на C#
public abstract class Saveable
{
// Неизменяемая обработка для метода определена в невиртуальном интерфейсе.
// Поведение, определенное таким образом, наследуется всеми производными классами.
// Например, создание и фиксация транзакции.
public void Save()
{
Console.WriteLine("Creating transaction");
CoreSave();
Console.WriteLine("Committing transaction");
}
// Обработка вариантов для метода определяется в интерфейсе подкласса.
// Это поведение может быть настроено по мере необходимости подклассами.
// Например, конкретная реализация сохранения данных в базе данных.
protected abstract void CoreSave();
}
public class Customer : Saveable
{
public string Name { get; set; }
public decimal Credit { get; set; }
protected override void CoreSave()
{
Console.WriteLine("Saved customer {0} with credit limit {1}", Name, Credit);
}
}
См. также:
Ссылки
- ↑ Carr, Richard Non-Virtual Interface Design Pattern . BlackWasp (3 сентября 2011). — «The non-virtual interface pattern is a design pattern that controls how methods in a base class are overridden. Base classes include public, non-virtual members that may be called by clients and a set of overridable methods containing core functionality.» Дата обращения: 12 сентября 2012. Архивировано 3 сентября 2011 года.
- ↑ Tambe, Sumant Non-Virtual Interface (NVI) idiom and the design intent . C++ truths (11 апреля 2007). Дата обращения: 12 сентября 2012. Архивировано 11 апреля 2007 года.
- ↑ Non-Virtual Interface Design Pattern . www.blackwasp.co.uk. Дата обращения: 19 сентября 2021.
- ↑ Non-Virtual Interface Design Pattern (Page 2 of 2) . www.blackwasp.co.uk. Дата обращения: 19 сентября 2021.
Внешние ссылки
Категория:Шаблоны проектирования Категория:Метод (информатика)