Teknologi

I Bouvet er vi flere hundre teknologer som brenner for å programmere og utforme gode, digitale løsninger. I denne bloggen utforsker vi teknologien og deler det vi finner med dere.

Patternskolen del 7 – Decorator vs. Arv

I forrige utbrudd så vi på State. Denne gangen skal vi se på Decorator, som noen ganger kan erstatte et av de mest kjente medlemmene i den objektorienterte verktøykassa: arv.

Decorator pattern

Decorator brukes til å utvide funksjonaliteten i en klasse, mye i likhet med arv. Decorator kalles av og til «wrapper», men det er greit å unngå dette navnet da Adapter patternet også omtales med samme navn. Hensikten er å utvide funksjonaliteten i en klasse ved at dekoratorklassen pakker den inn (eller «dekorerer» den med ny funksjonalitet, om du vil). Diagrammet under viser hvordan dette kan implementeres:

decorator

Vi tar utgangspunkt i et interface eller en abstrakt klasse, kalt Komponent i figuren. Den må vi ha en eller flere konkrete implementasjoner av (KonkretKomponent).

For å dekorere denne lager vi en abstrakt klasse, i dette tilfellet kalt Decorator. Den har en medlemsvariabel som peker til komponenten vi dekorerer.

Til slutt oppretter vi én eller flere konkrete implementasjoner av Decorator. I diagrammet over har vi bare én metode (operasjon), men vi kunne hatt mange flere. I dekoratørene videreformidles alle metodekall til den konkrete klassen, med unntak av de vi ønsker å overstyre med ny funksjonalitet.

Dette gjør at man kan dekorere en klasse med flere dekoratører og legge til flere features.

Eksempler

Har du jobbet med Stream-klassene i Java eller .NET, har du vært borti Decorator allerede.
For eksempel i Java:

Eller i .NET:

Under følger et eksempel i .NET som viser hvordan vi kan bruke flere dekoratører samtidig:

I eksempelet ønsker vi å lese en fil fra en database. Når vi leser fra en strøm, kan vi få bedre ytelse ved å bufre leseoperasjoner og vi dekorerer derfor med BufferedStream. For å spare lagringsplass har vi komprimert filinnholdet med GZip. For å dekomprimere dekorerer vi med GZipStream. Innholdet er også kryptert, og vi avslutter med å dekryptere med CryptoStream. Dette er neppe et godt eksempel på bruk av disse klassene, men illustrerer bruken av Decorator.

Vi kan relatere .NET-klassene til UML-diagrammet over: Den abstrakte klassen System.IO.Stream er Komponent. System.Data.SqlTypes.SqlFileStream er KonkretKomponent. System.IO.BufferedStream, System.IO.Compression.GZipStream og System.Security.Cryptography.CryptoStream er eksempler på KonkretDecorator.

Konklusjon

Som vi tidligere har sett med for eksempel Strategy og Template method så vil noen patterns trå i kraft i runtime og andre ved kompilering. Slik er det også med arv og Decorator. Ved arv legger man til funksjonalitet ved kompilering av koden, mens med Decorator skjer det i runtime.

Styrken i Decorator ligger i de tilfellene det er vanskelig eller praktisk umulig å implementere mange nok arvende klasser som tilbyr alle mulige kombinasjoner. For eksempel i Stream-klassene i Java og .NET, der vi ikke har lyst til å implementere klasser for varianter av FileStream, BufferedFileStream, CryptoBufferedFileStream, GZipBufferedFileStream, DeflateCryptoBufferedFileStream, GZipCryptoBufferedFileStream osv.

En ser også at Decorator gjør det enkelt å følge «Open/close principle» innen objektorientering.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

Magic Mirror – version 1

Introduction A while back I discovered the exciting world of “magic mirrors”. I don’t remember how or where it caught my attention, but..

DevOpsDays Oslo 2016

5.-6. september hadde eg gleden av å delta på den første norske DevOpsDays i Oslo. Her er en oppsummering av høydepunktene..

Bouvet at JavaZone 2016

This year JavaZone celebrated it’s 15th year with with 3000 attendees and over 170 sessions. As one of Norway’s premier Java..

IT years are like dogs years

One of the characteristics of the IT industry is that time works differently for us. This is challenging and fun,..

The Future of SharePoint

Den 4. mai holdt Microsoft en virtuell event om fremtiden til SharePoint, jeg fikk heldigvis anledning til å delta de..

SharePoint 2016 er på vei!

Som lovet var Microsoft ferdig med utviklingen av SharePoint Server 2016 (RTM – release to manufacturing) rett før påske, og..

En skybasert integrasjonsplattform

SAP HANA Cloud Integration SAP HANA Cloud Integration (HCI) er en skybasert integrasjonsplattform. Denne kan benyttes i stedet for SAP..

IoT Juleverksted

Tradisjonen tro var det i starten av desember tid for det årlige juleverkstedet hos Bouvet i Sandvika. Dette var tredje..

Bouvet Battle Royale – Rematch

Vår årlige fagdag ble i fjor kjørt som showdown mellom våre avdelinger som jobber med Java- og Microsoft-teknologi. Uten å..

Key takeaways fra JavaOne 2015!

JavaOne er verdens største Java-konferanse og arrangeres hvert høst i San Francisco. Her kan du oppleve foredrag fra noen av de..

Teknologi

I Bouvet er vi flere hundre teknologer som brenner for å programmere og utforme gode, digitale løsninger. I denne bloggen utforsker vi teknologien og deler det vi finner med dere.