Läsare som du hjälper till att stödja MUO. När du gör ett köp med hjälp av länkar på vår webbplats kan vi tjäna en affiliate-provision.

Mallmetodens designmönster låter dig definiera stegen för en algoritm inom en enda metod i en klass. Detta gör att du kan begränsa specifika operationer för en applikation till en enda metod.

Varje steg i algoritmen som mallmetoden definierar är en inre metod. Mallmetoden hanterar dock bara implementeringen av några av dess inre metoder. Underklasser implementerar vanligtvis en eller flera av mallmetodens inre metoder.

En underklass kan implementera en abstrakt metod, men den kan inte omdefiniera algoritmen som implementeras av en slutlig metod.

Hur mallmetoden fungerar

Ett typiskt mallmetodmönster kommer att ha följande struktur:

slutligtomhetmallMetod(){
abstractOperation1();
abstractOperation2();

konkretOperation1();
konkretOperation2();

krok();
}

Det första viktiga att notera är att templateMethod() är final, så ingen underklass kan åsidosätta denna metod. Det andra viktiga att notera är de tre typerna av metoder som mallmetodens mönster använder: konkret, abstrakt och krok.

instagram viewer

Den abstrakta klassen som innehåller mallmetoden implementerar alla dess konkreta metoder, medan konkreta underklasser implementerar dess abstrakta metoder. Hookmetoden gör vanligtvis ingenting som standard, men en underklass har förmågan att åsidosätta dessa metoder när det behövs.

Implementera mallmetoden i Java

Mallmetodmönstret fungerar som ett ramverk för en applikation. Så du kommer ofta att se det här mönstret i mjukvaruramverk som tillhandahåller ritningen för applikationsutveckling.

Du kan till exempel koppla din applikation till ett av många databassystem. Stegen för att ansluta till och använda en databas följer en liknande mall:

offentligabstraktklassDatabas{
// mallmetod
slutligtomhetdatabasmall(){
// abstrakta metoder
setDBDriver();
setCredentials();

// konkret metod
ansluta();

// abstrakta metoder
skapaDB();
setData();
readData();

// krokmetoder
if (userWantsToUpdate()) {
uppdatera data();
}

if (userWantsToDelete()) {
deleteData();
}

// konkret metod
closeConnection();
}

abstrakttomhetsetDBDriver();
abstrakttomhetsetCredentials();
abstrakttomhetskapaDB();
abstrakttomhetsetData();
abstrakttomhetreadData();
abstrakttomhetuppdatera data();
abstrakttomhetradera Data();

tomhetansluta(){
System.out.println("Ansluter till databas...");
}

tomhetstäng anslutning(){
System.out.println("Förstör databasanslutningen...");
}

boolesktuserWantsToUpdate(){
lämna tillbakafalsk;
}

boolesktuserWantsToDelete(){
lämna tillbakafalsk;
}
}

Denna exempeldatabasklass använder mallmetodens mönster för att skapa en mall som du kan använda med vilken databas som helst. För att använda en databas måste din applikation ansluta till den och sedan förstöra anslutningen efter användning. Dessa aktiviteter är vanligtvis desamma för alla databaser. Därför kan den abstrakta databasklassen implementera ansluta() och closeConnection() metoder.

De andra metoderna i mallmetoden kommer att skilja sig beroende på typen av databas. Till exempel lagrar en MySQL-databas data i tabeller, medan en MongoDB databas lagrar data i samlingar. Om du vill använda en MySQL-databas i Java, skapa helt enkelt en ny MySQL-klass som utökar databasklassen:

offentligklassMySQLsträcker sigDatabas{
@Åsidosätta
tomhetsetDBDriver(){
System.out.println("Väljer MySQL-drivrutin...");
}

@Åsidosätta
tomhetsetCredentials(){
System.out.println("Ställer in MySQL-databasuppgifter...");
}

@Åsidosätta
tomhetskapaDB(){
System.out.println("Skapar en ny tabell...");
}

@Åsidosätta
tomhetsetData(){
System.out.println("Infogar data i databasen...");
}

@Åsidosätta
tomhetreadData(){
System.out.println("Hämtar data från databasen...");
}

@Åsidosätta
tomhetuppdatera data(){
System.out.println("Uppdaterar data i databasen...");
}

@Åsidosätta
tomhetradera Data(){
System.out.println("Raderar data från databasen...");
}
}

MySQL-klassen implementerar alla abstrakta metoder i Databasklassen. Det kan också åsidosätta vissa konkreta metoder. Den kan dock inte röra databaseTemplate() metod, som använder det sista nyckelordet.

offentligklassMain{
offentligstatisktomhethuvud(String[] args){
Databas mySQLDB = ny MySQL();
mySQLDB.databaseTemplate();
}
}

Denna Main-klass skapar ett nytt MySQL-databasobjekt och använder mallmetoden för att simulera hur en applikation skulle ansluta till databasen. Genom att köra huvudmetoden skrivs följande ut till konsolen:

I utgången kommer du att märka att applikationen aldrig anropar uppdatera data() och deleteData() metoder. Det är därför krokmetoderna är viktiga. I en SQL-databas vill du skapa nya tabeller, infoga data och visa dina data. Däremot kanske du inte vill uppdatera eller radera data. Därför ger hook-metoderna underklasser möjlighet att kontrollera dessa kritiska aspekter av algoritmen.

@Åsidosätta
boolesktuserWantsToUpdate(){
lämna tillbakaSann;
}

Genom att helt enkelt lägga till koden ovan i MySQL-klassen uppdaterar applikationen nu data i databasen. Om du kör huvudklassen igen kommer den att visa följande uppdaterade utdata:

Som du kan se uppdaterar applikationen nu data i databasen.

Fördelarna med att använda mallmetodens designmönster

En stor fördel med mallmetodens mönster är att det främjar återanvändbarhet av programvara. Detta designmönster stöder också effektiv programmering. En underklass behöver bara implementera metoder som är unika för dess verksamhet.

Dessutom är en applikation som använder mallmetodens mönster säkrare, eftersom externa klasser inte kan ändra dess operationsstruktur.