Шаблон невиртуального интерфейса () управляет переопределением методов в базовом классе. Такие методы могут вызываться из клиентского кода и переопределяемых методов, содержащих основную функциональность. Этот шаблон тесно связан с шаблонным методом. Шаблон невиртуального интерфейса имеет все преимущества неабстрактного метода, вызывающего абстрактные методы, выполняющие реальную работу. Этот уровень косвенности позволяет выполнять операции до и после абстрактных операций — как непосредственно, так и при условии возможных непредвиденных изменений в будущем. Шаблон невиртуального интерфейса может быть использован с весьма малыми затратами на производство программного обеспечения и его высокой производительностью. Многие коммерческие программные фреймворки используют шаблон невиртуального интерфейса.

Преимущества и недостатки Использование этого шаблона приводит к разделению интерфейса класса на два отдельных интерфейса: Клиентский интерфейс: общедоступный невиртуальный интерфейс. Интерфейс подкласса: закрытый интерфейс, который может иметь любую комбинацию виртуальных и невиртуальных методов.

С такой структурой проблема хрупкого базового класса смягчается. Единственным недостатком является то, что код немного увеличен в размерах.

Пример на 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);

См. также Шаблонный метод (шаблон проектирования)

Ссылки

Категория:Шаблоны проектирования Категория:Метод (информатика)