Implementering av malmetodemønsteret i Java

1. Oversikt

I denne raske opplæringen vil vi se hvordan vi kan utnytte malmetodemønsteret - et av de mest populære GoF-mønstrene.

Det gjør det lettere å implementere komplekse algoritmer ved å kapsle logikken i en enkelt metode.

2. Implementering

For å demonstrere hvordan malmetodemønsteret fungerer, la oss lage et enkelt eksempel som representerer bygging av en datastasjon.

Gitt mønsterets definisjon, algoritmens struktur vil bli definert i en baseklasse som definerer malen bygge() metode:

offentlig abstrakt klasse ComputerBuilder {// ... offentlig slutt Computer buildComputer () {addMotherboard (); setupMotherboard (); addProcessor (); returnere ny datamaskin (computerParts); } offentlig abstrakt ugyldig addMotherboard (); offentlig abstrakt ugyldig oppsettMotherboard (); offentlig abstrakt ugyldig addProcessor (); // ...}

De ComputerBuilder klasse er ansvarlig for å skissere trinnene som kreves for å bygge en datamaskin ved å erklære metoder for å legge til og sette opp forskjellige komponenter, for eksempel et hovedkort og en prosessor.

Her, de bygge() metoden er malmetoden, som definerer trinn i algoritmen for montering av datamaskindelene og returnerer fullinitialisert Datamaskin tilfeller.

Legg merke til at jegt er erklært som endelig for å forhindre at den overstyres.

3. I aksjon

Med basisklassen allerede satt, la oss prøve å bruke den ved å opprette to underklasser. Den ene som bygger en "standard" datamaskin, og den andre som bygger en "high-end" datamaskin:

offentlig klasse StandardComputerBuilder utvider ComputerBuilder {@Override public void addMotherboard () {computerParts.put ("Motherboard", "Standard Motherboard"); } @ Override public void setupMotherboard () {motherboardSetupStatus.add ("Skruer standard hovedkort til saken."); motherboardSetupStatus.add ("Koble til strømforsyningskontaktene."); motherboardSetupStatus.forEach (trinn -> System.out.println (trinn)); } @ Overstyr offentlig ugyldig addProcessor () {computerParts.put ("Prosessor", "Standardprosessor"); }}

Og her er HighEndComputerBuilder variant:

offentlig klasse HighEndComputerBuilder utvider ComputerBuilder {@Override public void addMotherboard () {computerParts.put ("Motherboard", "High-end Motherboard"); } @ Override public void setupMotherboard () {motherboardSetupStatus.add ("Skru av high-end hovedkortet til saken."); motherboardSetupStatus.add ("Koble til strømforsyningskontaktene."); motherboardSetupStatus.forEach (trinn -> System.out.println (trinn)); } @ Override offentlig ugyldig addProcessor () {computerParts.put ("Prosessor", "Avansert prosessor"); }}

Som vi kan se, trengte vi ikke å bekymre oss for hele monteringsprosessen, men bare for å tilby implementeringer for separate metoder.

La oss nå se det i aksjon:

ny StandardComputerBuilder () .buildComputer (); .getComputerParts () .forEach ((k, v) -> System.out.println ("Del:" + k + "Verdi:" + v)); ny HighEndComputerBuilder () .buildComputer (); .getComputerParts () .forEach ((k, v) -> System.out.println ("Del:" + k + "Verdi:" + v));

4. Malmetoder i Java Core Libraries

Dette mønsteret er mye brukt i Java-kjernebibliotekene, for eksempel av java.util.AbstractList eller java.util.AbstractSet.

For eksempel, Abstrakt liste gir en skjelettimplementering av Liste grensesnitt.

Et eksempel på en malmetode kan være Legg til alle() metoden, selv om den ikke eksplisitt er definert som endelig:

public boolean addAll (int index, Collection c) {rangeCheckForAdd (index); boolsk modifisert = falsk; for (E e: c) {add (index ++, e); modifisert = sann; } retur modifisert; }

Brukere trenger bare å implementere legge til() metode:

public void add (int index, E element) {throw new UnsupportedOperationException (); }

Her er det ansvaret til programmereren å gi en implementering for å legge til et element i listen ved den gitte indeksen (variantdelen av noteringsalgoritmen).

5. Konklusjon

I denne artikkelen viste vi malemetodemønsteret og hvordan du implementerer det i Java.

Malmetodemønsteret fremmer gjenbruk og frakobling av kode, men på bekostning av bruk av arv.

Som alltid er alle kodeeksemplene vist i denne artikkelen tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found