Icke-virtuella gränssnittsmönster
Det icke-virtuella gränssnittsmönstret ( NVI ) styr hur metoder i en basklass åsidosätts. Sådana metoder kan anropas av klienter och överstyrbara metoder med kärnfunktionalitet. Det är ett mönster som är starkt relaterat till mallmetodens mönster . NVI-mönstret erkänner fördelarna med en icke-abstrakt metod som åberopar de underordnade abstrakta metoderna. Denna nivå av inriktning möjliggör för- och efteroperationer i förhållande till de abstrakta operationerna både omedelbart och med framtida oförutsedda förändringar. NVI-mönstret kan användas med mycket liten mjukvaruproduktion och körtidskostnad. Många kommersiella programvaror använder NVI-mönstret.
Fördelar och nackdelar
En design som följer detta mönster resulterar i en separation av ett klassgränssnitt i två distinkta gränssnitt:
- Klientgränssnitt: Detta är det offentliga icke-virtuella gränssnittet
- Underklassgränssnitt: Detta är det privata gränssnittet, som kan ha valfri kombination av virtuella och icke-virtuella metoder.
Med en sådan struktur mildras det bräckliga basklassgränssnittsproblemet . Den enda nackdelen är att koden förstoras lite.
C# Exempel
public abstract class Saveable { // Den invarianta bearbetningen för metoden är definierad i det icke-virtuella gränssnittet. // Beteendet som definieras så ärvs av alla härledda klasser. // Till exempel att skapa och utföra en transaktion. public void Spara () { Console . WriteLine ( "Skapar transaktion" ); CoreSave (); Konsol . WriteLine ( "Begår transaktion" ) ; } // Variantbehandlingen för metoden definieras i underklassgränssnittet. // Detta beteende kan anpassas efter behov av underklasser. // Till exempel den specifika implementeringen av att spara data till databasen. skyddad abstrakt void CoreSave (); } public class Customer : Saveable { public string Name { get ; set ; } public decimal Credit { get ; set ; } skyddad åsidosätt void CoreSave () { Console . WriteLine ( "Sparad kund {0} med kreditgräns {1}" , Namn , Kredit ) ; } }