2011-02-03 27 views
17

Antes de ir a describir mi problema en primer lugar, me gustaría definir las definiciones de método decorador y Extensión decoradorel decorador del patrón y Métodos de extensión en C#

Acople responsabilidades adicionales a un objeto de forma dinámica. Decoradores proporcionan una alternativa flexible para subclases para extender la funcionalidad

método de extensión

Los métodos de extensión le permiten "add" métodos a los tipos existentes sin crear un nuevo tipo derivado, recompilar, o de otra manera modificar el tipo original

he siguiente fragmento de código en 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); 
    } 
} 

En el código anterior extiendo la interfaz sin modificar el código existente, y estos dos métodos están disponibles para la clase derivada. Entonces mi pregunta es esta: ¿El método de extensión es un reemplazo del patrón de decorador?

+0

Tal Decorator habría sido encontrado para reemplazar los métodos de extensión estáticas sobre todo porque los métodos estáticos son difíciles de probar y aumentan acoplamiento. – Rockstart

Respuesta

18

Un método de extensión es realmente solo azúcar sintáctico para llamar a un método estático.

Mientras que con un decorador podría cambiar el comportamiento de su clase decorada, un método de extensión solo podría alterar propiedades o llamar a métodos de su clase, como un método estático "normal".

El patrón de decorador se define como el uso de un contenedor para modificar el comportamiento, algo que claramente no hace un método de extensión.

14

Ýse echa de menos la parte dinámica del patrón de decorador. Los métodos de extensión son bestias estáticas definidas en tiempo de compilación y se pueden usar o no ... pero no modificar/intercambiar en tiempo de ejecución.

+0

Gracias jdehaan por sus comentarios. Quiere decir que en el patrón decorador agregamos nuevas funcionalidades para escribir dinámicamente sin saberlo. –

+1

Sí, esto generalmente implica acordar una interfaz, pero esta funcionalidad también será reemplazable en el tiempo de ejecución, que no es el caso con los métodos de extensión: son elecciones de tiempo de compilación. – jdehaan

5

Los métodos de extensión no son un reemplazo para el patrón de decorador. Los métodos de extensión funcionan para proporcionar funcionalidad a un tipo existente sin tener que crear un tipo derivado.

Esto es diferente de la implementación tradicional al patrón de decorador. El patrón de decorador le permite proporcionar de forma dinámica comportamientos múltiples a un objeto en tiempo de ejecución sin tener que crear una nueva subclase para cada combinación de esos comportamientos.

4

Método de extensión a Patrón de decorador o patrón de visitante? Después de leer, diría que es más parecido al Visitante.

Citando la grandeza que es Wikipedia, la pedia que no tiene errores: P

En la programación orientada a objetos y la ingeniería de software, el patrón de diseño visitante es una manera de separar un algoritmo de un objeto estructura en la que opera. Un resultado práctico de esta separación es la capacidad de agregar nuevas operaciones a estructuras de objeto existentes sin modificando esas estructuras. Es una forma de seguir fácilmente el principio abierto/cerrado.En esencia, el visitante permite agregar nuevas funciones virtuales a una familia de clases sin modificar las clases ; en su lugar, se crea una clase de visitante que implementa todas las de las especializaciones apropiadas de la función virtual. El visitante toma la referencia de instancia como entrada e implementa el objetivo a través de doble envío.

0

Esta explicación por Erich Gamma (GOF) parece ser la mejor ... http://www.mif.vu.lt/~plukas/resources/Extension%20Objects/ExtensionObjectsPattern%20Gamma96.pdf

Esencialmente indicando que

a) La combinación de todas las operaciones y estado que los diferentes clientes (actuales y futuros) necesita en una interfaz única resultados en una interfaz inflada

b) Las operaciones deseadas (conocidas y desconocidas) se pueden categorizar en componentes. Desde el cual se puede definir una (o más) Interfaces de componentes (interfaces extendidas). Estos pueden o no ser implementados por objetos (actuales y futuros).

c) Los clientes que deseen utilizar este interfaz extendida puede consultar si un componente soporta

d) Por último, esta interfaz extendida tiene una clase base común (ComponentExtension) con interfaz mínima para gestionar la extensión en sí (comprobación si existe una extensión, informando a la extensión que está a punto de ser eliminado)

para ser usado cuando:

1 cuando sus clases existentes puede necesidad adicional y imprevistas interfaces (es decir nuevos patrones de comportamiento actualmente desconocidos).

2 Cuando una clase que representa una abstracción de teclas desempeña diferentes roles (imprevistos & abiertos) para diferentes clientes.

3 Usted desea extender sin subclasificar

Es similar a los siguientes patrones

Visitante que necesita jerarquía de clases estable & introduce ciclo de dependencia

decorador, donde el uso es más transparente, la interfaz es estrecha y las operaciones existentes deben aumentarse

adaptador que soporta interfaces existentes

Cuestiones relacionadas