Vraag Het decoratorpatroon en uitbreidingsmethoden in c #


Voordat ik eerst mijn probleem zou willen beschrijven, zou ik de definities van Decorator en Extension-methode willen definiëren Decorateur

Voeg extra verantwoordelijkheden toe aan een object op een dynamische manier. Decorateurs bieden een flexibel alternatief voor subklassen om de functionaliteit uit te breiden

Uitbreidingsmethode

Met uitbreidingsmethoden kunt u methoden aan bestaande typen 'toevoegen' zonder een nieuw afgeleide type te maken, opnieuw te compileren of anderszins het oorspronkelijke type te wijzigen

Ik heb het volgende codefragment in c #

public interface IMyInterface
{
    void Print();
}

public static class Extension
{
    public static void PrintInt(this IMyInterface myInterface, int i)
    {
        Console.WriteLine
            ("Extension.PrintInt(this IMyInterface myInterface, int i)");
    }

    public static void PrintString(this IMyInterface myInterface, string s)
    {
        Console.WriteLine
            ("Extension.PrintString(this IMyInterface myInterface, string s)");
    }
}

public class Imp : IMyInterface
{
    #region IMyInterface Members

    public void Print()
    {
        Console.WriteLine("Imp");
    }

    #endregion
}

class Program
{
    static void Main(string[] args)
    {
        Imp obj = new Imp();
        obj.Print();
        obj.PrintInt(10);
    }
}

In de bovenstaande code verleng ik de interface zonder de bestaande code te wijzigen, en deze twee methoden zijn beschikbaar voor afgeleide klassen. Dus mijn vraag is dit: is de uitbreidingsmethode een vervanging van het decorateurpatroon?


17
2018-02-03 15:33


oorsprong


antwoorden:


Een uitbreidingsmethode is eigenlijk gewoon syntactische suiker voor het aanroepen van een statische methode.

Terwijl je bij een decorateur eigenlijk het gedrag van je versierde klasse zou kunnen veranderen, zou een uitbreidingsmethode alleen eigenschappen of belmethoden in je klas kunnen veranderen, net als een "gewone" statische methode.

Decoratorpatroon is eigenlijk gedefinieerd als het gebruik van een wrapper om gedrag te veranderen, wat een uitbreidingsmethode duidelijk niet doet.


18
2018-02-03 15:37



Je mist het dynamische deel van het patroon van de decorateur. Uitbreidingsmethoden zijn statische beesten die tijdens het compileren zijn gedefinieerd en kunnen worden gebruikt of niet ... maar niet worden gewijzigd / uitgewisseld tijdens runtime.


15
2018-02-03 15:37



Uitbreidingsmethoden zijn geen vervanging voor het decorateurpatroon. Extensiemethoden werken om functionaliteit aan een bestaand type te leveren zonder een afgeleid type te hoeven maken.

Dit is anders dan de traditionele implementatie tot het patroon van de decorateur. Het patroon van de decorateur stelt u in staat om tijdens runtime dynamisch meerdere handelingen aan een object te leveren zonder een nieuwe subklasse te hoeven maken voor elke combinatie van dat gedrag.


5
2018-02-03 15:59



Uitbreidingsmethode een Decorator-patroon of een bezoekerspatroon? Na het lezen zou ik zeggen dat het meer verwant is aan de bezoeker.

Het citeren van de grootheid die wikipedia is, de pedia die nooit fouten bevat: P

In objectgeoriënteerd programmeren en software-engineering, de bezoeker   ontwerppatroon is een manier om een ​​algoritme van een object te scheiden   structuur waarop het werkt. Een praktisch resultaat van deze scheiding is de   mogelijkheid om nieuwe bewerkingen toe te voegen aan bestaande objectstructuren zonder   het aanpassen van die structuren. Het is een manier om het gemakkelijk te volgen   open / gesloten principe. In wezen staat de bezoeker toe om nieuw toe te voegen   virtuele functies naar een klassenfamilie zonder de klassen aan te passen   zich; in plaats daarvan creëert men een bezoekersklasse die alles implementeert   van de juiste specialisaties van de virtuele functie. De   bezoeker neemt de exemplaarreferentie als invoer en implementeert het doel   door dubbele verzending.


4
2017-08-04 02:42



Deze verklaring van Erich Gamma (GoF) lijkt de beste ... http://www.mif.vu.lt/~plukas/resources/Extension%20Objects/ExtensionObjectsPattern%20Gamma96.pdf

In essentie beweren dat

a) Het combineren van alle bewerkingen en stellen dat de verschillende clients (aanwezig en toekomstig) nodig hebben in een enkele interface resulteert in een opgeblazen interface

b) Gewenste bewerkingen (bekend en onbekend) kunnen worden onderverdeeld in componenten. Van waaruit een (of meer) componentinterfaces) (uitgebreide interfaces) kunnen worden gedefinieerd. Deze kunnen al dan niet worden geïmplementeerd door objecten (huidig ​​en toekomstig).

c) Cliënten die deze uitgebreide interface willen gebruiken, kunnen opvragen of een component dit ondersteunt

d) Ten slotte heeft deze uitgebreide interface een gemeenschappelijke basisklasse (ComponentExtension) met minimale interface om de extensie zelf te beheren (controleren of er een extensie bestaat, de extensie informeren dat deze op het punt staat te worden verwijderd)

Te gebruiken wanneer:

1 Wanneer uw bestaande klassen mei nodig hebben extra en onvoorzien interfaces (dat wil zeggen nieuwe, momenteel onbekende gedragspatronen).

2 Wanneer een klasse die een sleutelabstractie vertegenwoordigt verschillende (onvoorziene en open-ended) rollen voor verschillende cliënten speelt.

3 U wenst uit te breiden zonder subclassificatie

Het lijkt op de volgende patronen

Bezoeker die een stabiele klassehiërarchie nodig heeft en een afhankelijkheidscyclus introduceert

Decorateur waar het gebruik transparanter is, is de interface smal en moeten bestaande operaties worden uitgebreid

Adapter die BESTAANDE interfaces ondersteunt


0
2017-07-09 00:08