Gå til innhold

Delegering vs aggregering vs adapter (proxy)


Anbefalte innlegg

Jeg leser litt om arv og sånt i java, og har støtt på noen uttrykk som jeg ikke helt forstår.

 

Disse er delegering vs aggregering vs adapter vs proxy

 

Slik jeg forstår delegering: Eks: jeg har laget en klasse person og en klasse student. Istedet for å si at student utvider person kan jeg si at student bruker person (studentobjektet inneholder et personobjekt). Dette blir nemlig forklart i en av bøkene mine som adapter(proxy-pattern) og delegation er noe helt annet, mens i den andre kalles dette delegering.

 

Så videre:

Aggregering vs delegering. Jeg lurer på om aggregering er et uttrykk jeg har funnet opp selv, alternativt er aggregering og delegering det samme - eller jeg har misforstått hele greia. Aggregering, slik jeg forstår det er at en klasse bruker andre klasser (jfr def av delegering).

En aggregatklasse er dermed en samling av andre klasser. Hmm, kanskje forskjellen er at en aggregatklasse ikke har egne variabler, men bare bruker andre klasser.

Lenke til kommentar
Videoannonse
Annonse

Ut i fra det jeg forstår etter boka mi er en aggregering en del av sammenhengen (mellom klassene) som lever/eksisterer uavhengig av de andre delene, men brukes til å binde seg sammen med andre klasser, altså at objektene kan sammarbeide.

 

Er ikke helt sikker om det er helt riktig forklaring, men er ihvertfall det jeg har forstått.

 

EDIT: Du burde lese litt om komposisjon også for å sammenligne. Er omtrent det samme, men komposisjon har en sterkere binding eller noe sånt :hmm:

Endret av kjey
Lenke til kommentar
Jeg leser litt om arv og sånt i java, og har støtt på noen uttrykk som jeg ikke helt forstår.

 

Disse er delegering vs aggregering vs adapter vs proxy

 

Slik jeg forstår delegering: Eks: jeg har laget en klasse person og en klasse student. Istedet for å si at student utvider person kan jeg si at student bruker person (studentobjektet inneholder et personobjekt). Dette blir nemlig forklart i en av bøkene mine som adapter(proxy-pattern) og delegation er noe helt annet, mens i den andre kalles dette delegering.

6258595[/snapback]

Wrapper-klasser er typiske eksempel på delegering. Klassen som delegerer har ofte klin lik metoder som klassen som "blir delegert". Mange av metodene blir enkelt og greit sendt videre til den "virkelige" klassen, og wrapper-klassen føyer til et par ekstra funksjonaliter hvor det trengs (f.eks. logging osv.). På denne måten har man en klasse med mer funksjonalitet enn basis-klassen, med lavere kopling enn arv.

Lenke til kommentar
Wrapper-klasser er typiske eksempel på delegering. Klassen som delegerer har ofte klin lik metoder som klassen som "blir delegert". Mange av metodene blir enkelt og greit sendt videre til den "virkelige" klassen, og wrapper-klassen føyer til et par ekstra funksjonaliter hvor det trengs (f.eks. logging osv.). På denne måten har man en klasse med mer funksjonalitet enn basis-klassen, med lavere kopling enn arv.

6261535[/snapback]

 

jeg fikk en god forklaring på en usenet-gruppe, tilfelle noen andre lurer:

Jeg er nok ikke en pattern-guru, har ikke fått jobbet nok eller lest nok

om det til å ha noe i nærheten av en slik status. Men jeg kan gjøre et

forsøk på å forklare:

 

Delegering:

 

Hvis et objekt får en forespørsel, kaller den en metode i et annet

objekt, og returnerer svaret for denne, eks:

 

class UtilClass {

      public String getData() {

            return "data"; // data from a database or something

      }

 

}

 

class BigFunkyClass {

      UtilClass util = new UtilClass();

 

      public String getData() {

            return util.getData();

      }

 

}

 

Altså, om BigFunkyClass for en forespørsel etter metoden getData,

/delegerer/ den ansvaret videre til UtilClass, og lar den utføre selve

jobben.

 

Aggregering:

 

En klasse har mange klasser forbundet med seg, f.eks. en bil har hjul,

ratt, motor osv. Klassen bil kan selvsagt delegere metodekall til sine

klassene den har knyttet til seg. Men delegering betyr det samme som

delegering i vanlig språk. Del ut oppgaver, og hent inn informasjon når

oppgaven er utført, for å si det sånn.

 

Adapter:

 

En adapter er det programmatiske motstykket til en fysisk adapter

(f.eks. en sånn du har med på reise til utlandet for å stikke i

stikkontakten). Den sørger for at to grensesnitt som i utgangspunktet

ikke kan snakke sammen, kan gjøre det. Si du har en klasse som snakker

engelsk, og en som snakker norsk (bytt gjerne ut med mer reelle

problemer, f.eks. en forventer data i XML-format, mens datakilden

returnerer et merkelig binært format). Adapter-klassen vil da ta imot

kallet fra den kallende klassen, gjøre et kall til den andre klassen,

gjøre eventuelle transformasjoner på dataene, og returnere dem i korrekt

format til kalleren.

 

Eks:

 

class Caller {

 

        EnglishToNorwegianAdapter adapter = new                                                        EnglishToNorwegianAdapter();

 

        public void doStuff() {

                String data = adapter.getGreeting();

        }

 

}

 

class Adapter {

 

        NorwegianClass nc = new NorwegianClass();

 

        public String getGreeting() {

                String norwegianGreeting = nc.getGreeting();

                String englishGreeting = norwegianGreeting.replaceAll(          "Hei,

verden", "Hello World!");

                return englishGreeting;

        }

 

}

 

class NorwegianClass {

        public String getGreeting() {

                return "Hei, verden 07.06.2006";

        }

 

}

 

Proxy:

 

En proxy-klasse delegerer ansvaret over til andre klasser, spør du meg.

Så jeg vil si at en proxy bruker delegering. Men det kan f.eks. være en

lokal klasse som kaller objekter på en annen maskin, eller henter data

fra en database. Evt. kan den også mellomlagre (cache) disse dataene,

slik at man kan hente dem raskere (uten å hente data fra database eller

over nettverket) ved gjentatte forespørsler etter de samme dataene.

 

Eks:

 

class Caller {

        public void doSomething() {

                Proxy proxyObj = new Proxy();

 

                while(true) {

                    String data = proxyObj.getData();

                    try {

                        Thread.sleep(1000);

                    } catch(InterruptedException ie) {}

                }

        }

 

}

 

class Proxy {

        FancyDBObject obj = new FancyDBObject();

        String cachedData = null;

 

        long lastUpdateTime = 0;

 

        public String getData() {

                if (System.currentTimeMillis() - lastUpdateTime > 5000){

                        cachedData=obj.callLongAndTimeConsumingDBTask();

                }

                lastUpdateTime = System.currentTimeMillis();

                return cachedData;

        }

 

}

 

Enkelt og trivielt eksempel, men poenget er at Proxy utfører en tjeneste

på oppdrag for deg, og tar selv beslutninger om hvordan den skal få tak

i denne informasjonen. Hvert 5. sekund i dette eksemplet vil den hente

den oppdaterte versjonen fra databasen, ellers får du bare verdien som

er mellomlagret. Dette trenger ikke kalleren vite noe om

implementasjonen av.

 

Puh. Dette ble mye, men jeg håper det ble litt klarere. Hvis jeg har

sagt noe uklart eller feil, oppfordrer jeg andre til å rette på meg.

 

For meg ble alt mye klarere nå

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...