Modo adaptador
La definición de un patrón de adaptador (inglés: patrón de adaptador) a veces se llama estilo de embalaje o embalaje. Transfiera una interfaz de una clase a lo que el usuario espera. Una adaptación hace clases que no pueden funcionar juntas debido a la incompatibilidad de la interfaz.
Hay dos tipos de modos de adaptador:
1. Modo de adaptador de objeto: el adaptador de objeto cumple con la interfaz de expectativa del usuario a través de la asociación, y también reduce el acoplamiento malo entre los códigos. Se recomienda utilizar la "adaptación de objetos" en su trabajo.
2. Modo adaptador de clase: en este modo adaptador, el adaptador hereda sus clases implementadas (generalmente herencia múltiple). No hay herencia múltiple en Java, por lo que no la presentaré aquí.
lograr
1. Objetivo: define el método que el cliente necesita usar.
2. Adaptador: heredar o implementar el objetivo y adaptarse a los métodos adaptados para apuntar.
3. Adaptado: defina un método existente.
4. Cliente - Métodos de llamadas en el objetivo.
public class adaptee {public void especificRequest () {System.out.println ("¡Hola, soy de adaptado!"); }} Public Interface Target {public void request (); } El adaptador de clase pública implementa el objetivo {adaptee adaptee; public adapter () {adaptee = new adaptee (); } Public void request () {adaptee.specificRequest (); }} Cliente de clase pública {public static void main (string [] args) {target target = new Adapter (); Target.Request (); }}Para implementar el patrón de adaptador de clase, necesitamos un adaptador para heredar el adaptado.
Escenarios aplicables
1. Si desea usar una clase antigua y su interfaz no satisface sus necesidades, puede usar la clase de adaptador como clase de mediación.
2. Desea crear una clase de propósito general que pueda llamar a las interfaces de algunas clases no relacionadas para que lo use.
Modo de puente
La motivación a veces un resumen debe tener implementaciones diferentes. Por ejemplo, hay dos formas de guardar datos, una es el método de archivo y el otro es el método de la base de datos. La práctica habitual es heredar la clase que guarda datos y luego implementa diferentes formas de guardar datos. El problema con esto es que es difícil modificar y extender el método Guardar, y el método Guardar no se puede cambiar en tiempo de ejecución.
Definir un patrón de puente es uno de los patrones más complejos en un patrón de diseño de software, que separa las partes abstractas de las cosas de sus partes de implementación para que todos puedan cambiar de forma independiente.
Por ejemplo, el "círculo" y el "triángulo" se clasifican bajo la "forma" abstracta, mientras que el "círculo de dibujo" y el "triángulo de dibujo" se clasifican en la categoría de "dibujo" que se da cuenta del comportamiento, y luego "dibujar" se llama "forma".
1. Resumen - Defina métodos abstractos.
2. AbstractIMPL: use la interfaz de implementación para implementar métodos abstractos.
3. Implementador: define las interfaces para comportamientos de implementación específicos.
4. ConcreteMementor1, ConcreteMementor2: implementa la interfaz del implementador.
/ ** "Implementor"*/ Interface Drawingapi {public void DrawCircle (doble x, doble y, doble radio); }/** "Concreteimpplementer" 1/2*/class DrawingApi1 implementa DrawingApi {public void DrawCircle (doble x, doble y, radio doble) {System.out.printf ("API1.Circle a %F: %F Radius %F/N", X, Y, Radius); }}/** "ConcreteimpleMementer" 2/2*/class DrawingApi2 implementa DrawingApi {public void Drawcircle (doble x, doble y, radio doble) {System.out.printf ("api2.circle a %f: %f radius %f/n", x, y, radio); }} / ** "abstracción"* / forma de interfaz {public void draw (); // Público de bajo nivel Void resizeByPercentage (doble PCT); // alto nivel}/ ** "abstracción refinada"*/ class CirclesShape implementa forma {privado doble x, y, radio; Dibujo privado Drawingapi; Public CirclesShape (doble x, doble Y, radio doble, Drawingapi Drawingapi) {this.x = x; this.y = y; this.radius = radio; this.DrawingApi = DrawingApi; } // Implementación de bajo nivel IE específica public void draw () {drawingapi.DrawCircle (x, y, radio); } // de alto nivel, IE, abstracto, público específico Void resizeByPercentage (doble PCT) {Radius *= PCT; }} / ** "Cliente"* / Class BridgePatern {public static void main (string [] args) {forma [] formas = nueva forma [2]; formas [0] = nueva CirclesShape (1, 2, 3, new DrawingAPI1 ()); Formas [1] = nueva CirclesShape (5, 7, 11, new DrawingAPI2 ()); para (forma de forma: formas) {shape.resizeByPercentage (2.5); Shape.draw (); }}} Ejemplo
1. Guarde los datos mencionados en la motivación.
2. Marco de dibujo de los gráficos. Similar a la implementación en el código anterior.
Escenarios aplicables
1. No desea que la abstracción y la implementación tengan una relación fija, pero espera que la implementación pueda modificarse en tiempo de ejecución.
2. Tanto las piezas abstractas como de implementación se pueden ampliar de forma independiente sin afectarse entre sí.