En la ingeniería de programas informáticos, el patrón de la delegación del es una técnica donde un objeto exterior expresa cierto comportamiento pero en la responsabilidad de los delegados de la realidad de ejecutar de ese comportamiento a un objeto asociado en una inversión de la responsabilidad . El patrón de la delegación es la abstracción fundamental que sostiene la composición (también designado la agregación), el Mixins y los aspectos

Ejemplos

Ejemplo simple de Java

En este ejemplo de programación del lenguaje de Java, la clase C tiene trozos del método que remitan el f de los métodos () y el g () para clasificar A. La clase C finge que tiene cualidades de la clase A. lang=" del clase A { f vacía () {System.println (" A: hacer el " de f ();); } g vacío () {System.println (" A: hacer el " de g ();); } } clase C { delegación de // A = nueva A (); f vacía () {a.f (); } g vacío () {a.g (); } cualidades del normal de // X x = nuevo X (); y vacía () {/* rellenan *} } cañería pública de la clase { cañería pública del vacío de los parásitos atmosféricos (args de la secuencia) { C c = nueva C (); c.g (); } }

Ejemplo complejo de Java

Usando los interfaces, la delegación puede ser hecha más flexible y Typesafe . En este ejemplo, la clase C puede delegar a la clase A o a la clase B. La clase C tiene métodos a cambiar entre las clases A y B. Incluyendo los instrumentos las cláusulas mejoran el tipo seguridad, porque cada clase debe ejecutar los métodos en el interfaz. La compensación principal es más código. lang=" del interfaz I { f vacía (); g vacío (); } instrumentos de la clase A I { público f vacía () {System.println (" A: hacer el " de f ();); } público g vacío () {System.println (" A: hacer el " de g ();); } } instrumentos de la clase B I { público f vacía () {System.println (" B: hacer el " de f ();); } público g vacío () {System.println (" B: hacer el " de g ();); } } instrumentos de la clase C I { delegación de // Yo i = nueva A (); público f vacía () {i.f (); } público g vacío () {i.g (); } cualidades del normal de // toA vacío () {i = nueva A (); } toB vacío () {i = nuevo B (); } } cañería pública de la clase { cañería pública del vacío de los parásitos atmosféricos (args de la secuencia) { C c = nueva C (); c.g (); } }

Ejemplo complejo de C++

Este ejemplo es una versión C++ del ejemplo complejo de Java arriba. Puesto que C++ no tiene una construcción del interfaz, una clase virtual pura desempeña el mismo papel. Las ventajas y las desventajas están en gran parte iguales que en el ejemplo de Java.

lang=" del

del #include usar namespace std; clase I { público: vacío virtual f () = 0; vacío virtual g () = 0; ~I virtual () {} }; clase A: público I { público: f vacía () {cout << " A: hacer el " de f (); << endl; } g vacío () {cout << " A: hacer el " de g (); << endl; } ~A () {cout << " A: limpieza up." << endl; } }; clase B: público I { público: f vacía () {cout << " B: hacer el " de f (); << endl; } g vacío () {cout << " B: hacer el " de g (); << endl; } ~B () {cout << " B: limpieza up." << endl; } }; clase C: público I { público: construcción/destrucción de // C (): i (nueva A ()) {} ~C virtual () {cancelación i; } privado: delegación de // I* i; público: f vacía () {i->f (); } g vacío () {i->g (); } cualidades del normal de // toA vacío () {cancelación i; i = nueva A (); } toB vacío () {cancelación i; i = nuevo B (); } }; cañería de la internacional () { C* c = nueva C (); c->f (); c->g (); c->toB (); c->f (); c->g (); }

Ejemplo Objetivo-c

La delegación es muy común en el marco del cacao (la biblioteca más común del cliente de Objetivo-c). Aquí está un ejemplo que implica una opinión del movimiento en sentido vertical, que preguntará a su delegado si es aceptable enrollar a cierto punto antes de hacer tan. lang=" del @interface TCScrollView: Opinión de encargo de NSView//A que enrolla a sus niños. { delegado de la identificación; Delegado de // A que quiere actuar en acontecimientos en esta visión } - scrollToCenter (de IBAction): remitente (identificación); Método de // A que se puede limitar a un botón en el UI - scrollToPoint (vacío): (NSPoint) a; Accessors de //. Puesta en práctica no demostrada. - delegado (identificación); - setDelegate (vacío): newDelegate (identificación); @end

Categoría de // A en NSObject que describe métodos posibles del delegado de TCScrollView. // esto es un protocolo informal: el ejecutor no tiene que ejecutar todos o aún cualesquiera de // los métodos en el protocolo @interface TCScrollViewDelegate (NSObject) - scrollView (BOOL): shouldScrollToPoint del scrollView (de TCScrollView*): newPoint (de NSPoint); @end

@implementation TCScrollView - scrollToCenter (de IBAction): remitente (identificación); { scrollToPoint: NSPointMake (0.0); } - scrollToPoint (vacío): (NSPoint) a; { shouldScroll de BOOL = SÍ; // si tenemos un delegado, y ese delegado ejecuta de hecho nuestro método del delegado, si (respondsToSelector del && del delegado: @selector (scrollView: shouldScrollToPoint:)) shouldScroll = scrollView: shouldScrollToPoint del uno mismo: a; // lo pide si es aceptable enrollar a este punto. ¡si (! vuelta del shouldScroll); // si no, no hace caso de la petición de la voluta. /// que enrollaba código omitió. } @end

@interface MyCoolAppController { scrollView de IBOutlet TCScrollView*; } @end @implementation MyCoolAppController - awakeFromNib (vacío); { setDelegate: uno mismo; } - scrollView (BOOL): shouldScrollToPoint del scrollView (de TCScrollView*): newPoint (de NSPoint); { si (newPoint.y > 0) vuelta SÍ; volver NO; } @end

Ejemplo usar el PHP

Decir que usted escribe una clase del padre a los gatos modelo y después que extiende la clase a los gatos específicos:

lang=" del gato de la clase { maullido de la función () { eco “maullido”; } Snuggle de la función () { eco “ronroneo”; } la función come () { $this->meow (); $this->meow (); $this->meow (); me repite “pidió hasta que consiguiera el alimento, ahora yo está comiendo”; } sueño de la función () { repetir “encresparse para arriba en cama del gato”; } }

el Tabby de la clase extiende el gato { drenaje de la función () { eco “que parezco un tabby”; } } la clase BlackCat extiende el gato { drenaje de la función () { eco “tengo piel negra lisa”; } }

Este código está muy bien; sin embargo, digámosle miran un documental sobre leones y lo realizan que usted no modeló leones. Al mismo tiempo usted también piensa que usted quisiera agregar en guepardos y tigres, así que usted fijó sobre la ejecución de la clase siguiente de Lion. lang=" del el león de la clase extiende el gato { maullido de la función () { " del eco; No puedo meow" ; } rugido de la función () { eco “rugido”; } Snuggle de la función () { el eco “come a tonto que intentó snuggle conmigo”; } sueño de la función () { eco “que se encrespa para arriba debajo de árbol”; } la función come () { eco “gazelles de la caza”; } drenaje de la función () { eco “que parezco un león”; } }

Tan ahora usted tiene una clase del león, no obstante usted también tiene un nuevo () método roar de . Ahora usted tiene que corregir todo su código para probar si esto es un león, y si tan rugido de la llamada en vez del maullido. Usted realiza que los tigres también rugen, sueño debajo de árboles y no snuggle bien, pero no comen gazelles. Quizás usted podría hacer que un gato grande lo clasifica y extiende a los tigres y a los leones y elimina las clases bajas. Pero por otra parte usted realiza que un guepardo es un gato grande que duerme debajo de árboles y come gazelles, pero no rugen. Esto está consiguiendo más sucio por el minuto. Usted ve después que otro documental con los gatos de civeta y ellos comen pájaros y que duermen en los árboles y que hacen un diverso sonido. ¡Oh no! Su código ahora es un desastre llenado de las clases extendidas a la izquierda e a la derecha con todas las clases de métodos que son eliminados. Encima de todo el esto usted también realiza que si usted termina para arriba con centenares de gatos que duerman debajo de los árboles que eliminan el método del sueño y quieren cambiar lo que hace ese método, usted necesitará corregir cada solo lugar se elimine que.

Intentemos esto un poco diferentemente y definamos un interfaz abstracto del gato como sigue: lang=" del ICat abstracto { $SoundBehavior privado; $SnuggleBehavior privado; $EatBehavior privado; $SleepBehavior privado; función MakeSound () { $this->SoundBehavior->MakeSound (); } Snuggle de la función () { $this->SnuggleBehavior->Snuggle (); } la función come () { $this->EatBehavior->Eat (); } sueño de la función () { $this->SleepBehavior->Sleep (); } drenaje de la función () {} setSoundBehavior de la función ($SoundBehavior) { $this->SoundBehavior = $SoundBehavior; } setSnuggleBehavior de la función ($SnuggleBehavior) { $this->SnuggleBehavior = $SnuggleBehavior; } setEatBehavior de la función ($EatBehavior) { $this->EatBehavior = $EatBehavior; } setSleepBehavior de la función ($SleepBehavior) { $this->SleepBehavior = $SleepBehavior; } }

Ahora crear un interfaz para cada comportamiento, después una puesta en práctica usar SoundBehavior como ejemplo (cada comportamiento necesitaría su propio interfaz/puesta en práctica): lang=" del interfaz SoundBehavior { función MakeSound () {} } el rugido de la clase ejecuta SoundBehavior { función MakeSound () { eco “rugido”; } } el maullido de la clase ejecuta SoundBehavior { función MakeSound () { eco “maullido”; } } Si se asume que le creó todos sus comportamientos, dejarnos define un león y un gato lang=" del la clase HouseCat amplía ICat { gato de la función () { $this->SetSoundBehavior (nuevo maullido ()); $this->SetSnuggleBehavior (nuevo PurrSnuggle ()); $this->SetEatBehavior (nuevo BegForFood ()); $this->SetSleepBehavior (nuevo SleepInBed ()); } drenaje de la función () { eco “que parezco un gato llano”; } } el Tabby de la clase amplía HouseCat { drenaje de la función () { eco “que parezco un Tabby”; } } el tigre de la clase amplía ICat { gato de la función () { $this->SetSoundBehavior (nuevo rugido ()); $this->SetSnuggleBehavior (nuevo EatSnuggler ()); $this->SetEatBehavior (nuevo HuntGazelles ()); $this->SetSleepBehavior (nuevo SleepUnderTree ()); } drenaje de la función () { eco “que parezco un tigre”; } }

Este interfaz abstracto final ICat, responsabilidad de los delegados del comportamiento del gato en vez de usar métodos en una clase baja y de eliminarlos donde necesitado. Si no utilizáramos a delegación arriba necesitaríamos eliminar clases bajas del método en varias ocasiones en subclases. Las clases adicionales se pueden agregar que comparten alguno, pero no toda la, funcionalidad del gato usar un diverso sistema de delegados.

Ejemplo complejo de Eiffel

Este ejemplo es una versión de Eiffel del ejemplo complejo de Java arriba.

lang=" del característica diferida de la clase I f es extremo diferido g es extremo diferido extremo la clase A hereda la característica de I f es imprime (" A: hacer f%N") extremo g es imprime (" A: hacer g%N") extremo extremo la clase B hereda la característica de I f es imprime (" B: hacer f%N") extremo g es imprime (" B: hacer g%N") extremo extremo la clase C hereda el to_a de la creación de I, característica del to_b i: I f es hace el extremo de i.f g es hace el extremo de i.g el to_a es crea {A} el extremo de i el to_b es crea {B} el extremo de i extremo característica principal de la creación PRINCIPAL de la clase la cañería es c local: C hace crear c.g extremo extremo

Críticas

Este patrón sacrifica típicamente la optimización de la velocidad a favor de la claridad realzada de la abstracción.

Ver también


patrón del diseño
Poste-objeto que programa
El proyecto de PerfectJPattern Open Source, proporciona componentized es decir una puesta en práctica sin contexto y tipo-segura del patrón del delegado en Java

.

  • Zenithic
  • Croydon Rural District
    Random links:Dulcie se extiende parque nacional | Goodwell, Oklahoma | Golpe del oeste del aeropuerto de Irlanda | Orientifold | George Gollin

  • © 2007-2008 enciclopediaespana.com; article text available under the terms of GFDL, from en.wikipedia.org
    ="http://pagead2.googlesyndication.com/pagead/show_ads.js">