Delegationsmönster

Inom mjukvaruteknik är delegeringsmönstret ett objektorienterat designmönster som gör att objektkompositionen kan uppnå samma kodåteranvändning som arv .

Vid delegering hanterar ett objekt en begäran genom att delegera till ett andra objekt (delegaten ) . Delegaten är ett hjälpobjekt , men med det ursprungliga sammanhanget . Med stöd för delegering på språknivå görs detta implicit genom att jag i delegaten hänvisar till det ursprungliga (sändande) objektet, inte delegaten (mottagande objekt). I delegatmönstret åstadkommes detta istället genom att explicit skicka det ursprungliga objektet till delegaten, som ett argument till en metod. Observera att "delegering" ofta används löst för att referera till det distinkta konceptet vidarebefordran , där det sändande objektet helt enkelt använder motsvarande medlem på det mottagande objektet, utvärderat i sammanhanget för det mottagande objektet, inte det ursprungliga objektet.

Observera att den här artikeln använder "sändande objekt/mottagande objekt" för de två objekten, snarare än "mottagande objekt/delegat", och betonar vilka objekt som skickar och tar emot delegeringsanropet, inte det ursprungliga anropet.

Definition

I Introduktionen till Gamma et al. 1994 definierade Grady Booch delegation som:

Delegering är ett sätt att göra komposition lika kraftfull för återanvändning som arv [Lie86, JZ91]. Vid delegering två objekt involverade i hanteringen av en begäran: ett mottagande objekt delegerar operationer till sin delegat . Detta är analogt med underklasser som skjuter upp förfrågningar till överordnade klasser. Men med arv kan en ärvd operation alltid referera till det mottagande objektet genom denna medlemsvariabel i C++ och själv i Smalltalk. För att uppnå samma effekt med delegering överlämnar mottagaren sig själv till delegaten för att låta den delegerade operationen referera till mottagaren.

Exempel

I exemplet nedan (med programmeringsspråket Kotlin ) delegerar klassen Window anropet area () till sitt interna Rectangle-objekt (dess delegat).

       
         


    
    
       
 klass  Rektangel  (  val  bredd  :  Int  ,  val  höjd  :  Int  )  {  roligt  område  ( )  =  bredd  *  höjd  }  klass  Fönster  (  val  gränser  :  rektangel  )  {  // Delegation  roligt  område  ( )  =  gränser  .  område  ()  } 

Språkstöd

Vissa språk har särskilt stöd för delegering inbyggt. Till exempel i Kotlins programmeringsspråk skulle vi kunna skriva:

  
      


         
          


         gränssnitt  ClosedShape  {  roligt  område  ():  Int  }  klass  Rektangel  (  val  bredd  :  Int  ,  val  höjd  :  Int  )  :  ClosedShape  {  åsidosätt  roligt  område  ()  =  bredd  *  höjd  }  klass  Fönster  (  privata  val  gränser  :  ClosedShape  )  :  ClosedShape  av  gränser 

Se även

externa länkar