Dekoratörer tillåter oss att lägga till beteende till objekt under körning och påverkar inte andra objekt i klassen. Dekoratörer kan användas när du dynamiskt behöver lägga till och ta bort ansvar för en klass. Dekoratörsmönstret är ett användbart alternativ till att skapa underklasser. De ger ytterligare funktionalitet till en klass samtidigt som de håller det offentliga API:et konsekvent. Låt oss titta på ett exempel för att förstå vikten av Ruby Decorators.
anser att vi har en Tattoo-klass med en prismetod som ger 300.
Klass Tatuering def pris 300 slutslutNu kommer vi att lägga till en extra färg som en funktion, och priset skulle höjas med 150 Det enklaste sättet är att skapa en TattooWithColour-underklass som returnerar 450 i prismetoden.
klass TattooWithColour < Tattoo def pris 450:- slutändeDärefter måste vi representera en stor tatuering som lägger till 200 till priset på våra tatueringar. Vi kan representera detta med en BigTattoo-underklass av Tattoo.
klass BigTattoo < Tattoo def pris 500 slutslutVi kan också ha större tatueringar och de kan lägga ytterligare pris på vår BigTattoo. Om vi skulle anse att dessa tatueringar skulle kunna användas med färger, skulle vi behöva lägga till underklasserna BigTattooWithColour och BiggerTattooWithColour. Med denna metod hamnar vi på totalt 6 klasser. Till och med Dubbla så många om du vill representera dessa kombinationer med extra mönster på tatuering.
Ärver dynamiskt med moduler
För att förenkla vår kod kan vi använda moduler för att dynamiskt lägga till beteende till vår Tattoo-klass. Låt oss skriva ColourTattoo och BigTattoo-moduler för detta.modul ColourTattoo def pris super + 150 ändände
modul BigTattoo def pris super + 200 slutslutNu kan vi utöka våra tatueringsobjekt dynamiskt med Object#extend-metoden. tattoo = Tattoo.new tattoo.extend(ColourTattoo) tattoo.extend(BigTattoo) Detta är en bra förbättring jämfört med vår arvsbaserade implementering. Istället för att ha underklasser har vi bara en klass och 3 moduler. Om vi behövde lägga till extra design till ekvationen behöver vi bara fyra moduler istället för 12 klasser.
Applicera dekorationsmönstret
Denna modulbaserade lösning har förenklat vår kod avsevärt, men vi kan fortfarande förbättra den genom att använda dekoratören. Vi kommer att betrakta en BiggerTatto som bildad genom att två gånger lägga till 150 till kostnaden för en tatuering. Vi kan inte göra detta med vårt modulbaserade tillvägagångssätt. Det skulle vara frestande att ringa tattoo.extend(BigTattoo) två gånger för att få BiggerTattoo. Att utöka modulen andra gången har ingen effekt när vi redan har använt förlängningsmoduler. Om vi skulle fortsätta använda samma implementering skulle vi behöva ha en BiggerTattoo-modul som ger super + 300 som kostnad. Istället kan vi använda dekorator som kan komponeras för att bygga komplexa föremål. Vi börjar med en dekoratör som heter BigTattoo som är ett omslag runt ett Tattoo-objekt.class BigTatto def initialize(tattoo) @tattoo = tatueringsslut
def pris @tattoo.price + 150 slutslutStörre tatuering kan nu skapas genom att använda detta omslag två gånger på ett tatueringsobjekt. tattoo = Tattoo.new big_tattoo= BigTattoo.new(tattoo) bigger_tattoo = BigTattoo.new(big_tattoo) Vi kan på liknande sätt representera färgtatueringar med en TattooWithColour-dekoratör. Med bara tre klasser kan vi nu representera 6 typer av tatueringar. Med rik expertis inom alla aspekter av Ruby On Rails Development, har vi på Railscarma, erbjuder dig ett brett utbud av tjänster för att hjälpa dig att implementera en heltäckande personlig strategi för att kommunicera med dina potentiella kunder och dina kunder vid rätt tidpunkt, genom rätt kanaler. För mer detaljer Kontakta oss.
Prenumerera för de senaste uppdateringarna
relaterade inlägg