CruellaDeVille Skrevet 7. juni 2006 Del Skrevet 7. juni 2006 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
kjey Skrevet 7. juni 2006 Del Skrevet 7. juni 2006 (endret) 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 Endret 7. juni 2006 av kjey Lenke til kommentar
Patton Skrevet 7. juni 2006 Del Skrevet 7. juni 2006 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
CruellaDeVille Skrevet 8. juni 2006 Forfatter Del Skrevet 8. juni 2006 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 nokom 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå