modo de adaptador gráfico patrones de diseño de Java

Adaptadores ejemplos de la vida real de

toma de Tailandia con los dos agujeros (estándar europeo), puede comprar un adaptador de enchufe multifuncional (adaptador) para que pueda utilizar.
Aquí Insertar imagen Descripción

modo de adaptador introducción básica

1) modo de adaptador (adapter) convertida en una interfaz, una interfaz de cliente representa un deseado adicional, el objetivo principal es la compatibilidad, de manera que la interfaz no coincide con el original no puede ser debido a trabajo con dos clases pueden trabajar juntos. Qué alias envoltura (la envoltura)
2) son el modo adaptador estructural Modo
3) dividido en tres categorías: el modo de adaptador de la clase, el modo de adaptador de objeto, el modo de adaptador de interfaz

funciona el modo de adaptador

Funciona
1) el modo de adaptador: Convertir la interfaz de una clase en otra interfaz para: para que la interfaz original no es compatible con la clase compatibles
2) desde el punto de vista del usuario no puede ser adaptado que está desacoplado
3) llamadas de los usuarios adaptador de interfaz de destino conversión a cabo método, entonces la llamada del adaptador está adaptado para el método de interfaz relevante
4) el usuario recibe el resultado de retroalimentación, y la interacción de la interfaz de destino sólo se sienten como
Aquí Insertar imagen Descripción

adapter Clase

Modelo de adaptador de clase describe
los conceptos básicos: la clase adaptador src por la herencia de clases, el horario de verano implementar la interfaz de clase, src completa - "adaptación DST.
Modelo de adaptador de Clase Ejemplo de aplicación
1) Un ejemplo ilustra
de ejemplo para explicar la vida del adaptador del cargador, el propio cargador con respecto Adaptador, 220V AC con respecto a la src (es decir, más en forma), nuestro DST objetivo (es decir, de destino) es 5V DC
2) análisis Pensamiento (clase FIG)
Aquí Insertar imagen Descripción

package com.example.demo.adapter.classadapter;

public class Voltage220V {
	/**
	 * 输出220V的电压
	 */
	public int output220V() {
		int src = 220;
		System.out.println("电压 = " + src + "伏");
		return src;
	}
}
package com.example.demo.adapter.classadapter;

public interface IVoltage5V {
	int output5V();
}
package com.example.demo.adapter.classadapter;

/**
 * 适配器类
 * @author zhaozhaohai
 *
 */
public class VoltageAdapter extends Voltage220V implements IVoltage5V{

	@Override
	public int output5V() {
		// 获取到220V电压
		int srcV = output220V();
		// 转成5v
		int dstV = srcV / 44;
		return dstV;
	}

}
package com.example.demo.adapter.classadapter;

public class Phone {
	
	/**
	 * 充电
	 * @param iVoltage5V
	 */
	public void charging(IVoltage5V iVoltage5V) {
		if (iVoltage5V.output5V() == 5) {
			System.out.println("电压为5V,可以充电~~");
		} else if (iVoltage5V.output5V() > 5) {
			System.out.println("电压大于5V,不能充电~~");
		}
	}
}
package com.example.demo.adapter.classadapter;

public class Client {
	public static void main(String[] args) {
		System.out.println(" === 类适配器模式 ===");
		Phone phone = new Phone();
		phone.charging(new VoltageAdapter());
	}
}

patrón y los detalles Adaptador Notas Clase

1) Java es un solo mecanismo de herencia, por lo que las clases necesitan para heredar clase adaptador src que puede ser considerado un inconveniente ya que requiere dst debe ser una interfaz, hay ciertas limitaciones;
2) Clase de métodos src estará expuesto en el adaptador, también aumentó el coste de utilización.
3) Debido a su clase src heredado, por lo que puede sobrescribir el método de acuerdo con las necesidades de la src clase, de tal manera que la clase Adaptador de flexibilidad mejorada.

Modo Object Adapter

1) las ideas básicas y la clase adaptador mismo patrón, pero será modificada clase adaptador, no se hereda la clase src, pero la clase celebrada ejemplo, src, a los problemas de compatibilidad de direcciones. A saber: clase contiene src, interfaz de clase dst para lograr completa src - "adaptador dst
2)" Síntesis de los principios de multiplexado", en el sistema para hacer uso de asociación (agregación) en lugar de la herencia relaciones.
3) Adaptador de modo de adaptador objeto se utiliza comúnmente como un modelo
Aquí Insertar imagen Descripción

package com.example.demo.adapter.objectadapter;

/**
 * 被适配的类
 * @author zhaozhaohai
 *
 */
public class Voltage220V {
	/**
	 * 输出220V的电压
	 */
	public int output220V() {
		int src = 220;
		System.out.println("电压 = " + src + "伏");
		return src;
	}
}
package com.example.demo.adapter.objectadapter;

/**
 * 适配接口
 * @author zhaozhaohai
 *
 */
public interface IVoltage5V {
	int output5V();
}
package com.example.demo.adapter.objectadapter;

/**
 * 适配器类
 * @author zhaozhaohai
 *
 */
public class VoltageAdapter implements IVoltage5V{
	/**
	 * 关联关系 - 聚合
	 */
	private Voltage220V voltage220V;
	
	/**
	 * 通过构造器,传入一个Voltage220V 实例
	 * @param voltage220v
	 */
	public VoltageAdapter(Voltage220V voltage220v) {
		this.voltage220V = voltage220v;
	}

	@Override
	public int output5V() {
		int dstV = 0;
		if (voltage220V != null) {
			// 获取220V 电压
			int src = voltage220V.output220V();
			System.out.println("使用对象适配器,进行适配~~");
			dstV = src / 44;
			System.out.println("适配完成,输出的电压为 = " + dstV);
		}
		return dstV;
	}

}
package com.example.demo.adapter.objectadapter;

public class Phone {
	
	/**
	 * 充电
	 * @param iVoltage5V
	 */
	public void charging(IVoltage5V iVoltage5V) {
		if (iVoltage5V.output5V() == 5) {
			System.out.println("电压为5V,可以充电~~");
		} else if (iVoltage5V.output5V() > 5) {
			System.out.println("电压大于5V,不能充电~~");
		}
	}
}
package com.example.demo.adapter.objectadapter;

public class Client {
	public static void main(String[] args) {
		System.out.println(" === 对象适配器模式 ===");
		Phone phone = new Phone();
		phone.charging(new VoltageAdapter(new Voltage220V()));
	}
}

Precauciones adapter objeto y detalles

1) Objeto del adaptador y el adaptador de clase, de hecho, la misma idea, pero se dieron cuenta de diferentes maneras.
El principio sintético multiplexación, una combinación de herencia alternativa, de modo que se ocupa de las limitaciones del adaptador debe heredar Clases de src, dst ya no debe ser requiere la interfaz.
Inferior 2) el costo, y más flexible.

el modo de adaptador de interfaz

1) algunos libros llamados: modo de adaptador (adapter por defecto) o el modo de adaptador predeterminado.
2) Cuando ninguna interfaz proporciona un método para lograr la plena, puede estar diseñado para implementar una interfaz clase abstracta y proporcionar un método de aplicación (vacío predeterminado método) para cada interfaz, la subclase abstracta de esta clase puede ser selectivamente método anular algunos requisitos de implementación de la clase padre de la clase a
caso 3) se aplica a todos los que desee utilizar un método de interfaz de los mismos
Aquí Insertar imagen Descripción

package com.example.demo.adapter.interfaceadapter;

public interface Interface4 {
	
	public void m1();
	
	public void m2();
	
	public void m3();
	
	public void m4();

}
package com.example.demo.adapter.interfaceadapter;

/**
 * 在AbsAdapter 我们将Interface4 的方法进行默认实现
 * @author zhaozhaohai
 *
 */
public abstract class AbsAdapter implements Interface4{
	@Override
	public void m1() {
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public void m2() {
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public void m3() {
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public void m4() {
		// TODO Auto-generated method stub
		
	}
}
package com.example.demo.adapter.interfaceadapter;

public class Client {
	public static void main(String[] args) {
		AbsAdapter absAdapter = new AbsAdapter() {
			
			/**
			 * 只需要去覆盖我们需要使用的接口方法
			 */
			@Override
			public void m1() {
				System.out.println("使用类m1的方法");
			}
			
		};
		absAdapter.m1();
	}
}

marco modo de adaptador de análisis en la aplicación de origen SpringMVC

1) SpringMVC en HandlerAdapter, en el uso de modo adaptador Clase
solicitud 2) SpringMVC procesamiento opinión de flujo
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
(1) para asignar el controlador por el HandlerMapping
(2) para obtener el adaptador
(3) por medio de un controlador de llamada adaptador y vuelve ModelAndView
implementado sub en HandlerAdapter de clase, cada controlador hay un uso correspondiente de la clase de implementación del adaptador, cada controlador hay diferentes implementaciones
3) el uso del análisis HandlerAdapter razón:
se puede ver los diferentes tipos de procesadores, tienen múltiples implementaciones, la llamada en el camino no es seguro, si es necesario llamar al método controlador directamente, usted tiene que llamar cuando se necesita el uso constante si los demás para juzgar qué tipo de semillas y luego ejecutado. Así que si usted desea extender detrás de controlador, tiene que modificar el código original, por lo que, contrariamente a los principios de la OCP.
4) entrega SpringMVC llegar a escribir el código fuente correspondiente a través de un patrón de diseño del controlador del adaptador
Aquí Insertar imagen Descripción

package com.example.demo.adapter.sprringmvc;


/**
 * 多种Controller实现
 * @author zhaozhaohai
 *
 */
public interface Controller {

}

class HttpController implements Controller {
	public void doHttpHandler() {
		System.out.println("http....");
	}
}

class SimpleController implements Controller {
	public void doSimplerHandler() {
		System.out.println("simple...");
	}
}

class AnnotationController implements Controller {
	public void doAnnotationHandler() {
		System.out.println("annotation...");
	}
}
package com.example.demo.adapter.sprringmvc;


/**
 * 定义一个Adapter接口
 * @author zhaozhaohai
 *
 */
public interface HandlerAdapter {
	public boolean supports(Object handler);
	
	public void handle(Object handler);
}

/**
 * 多种适配器类
 * @author zhaozhaohai
 *
 */
class SimpleHandlerAdapter implements HandlerAdapter {

	@Override
	public boolean supports(Object handler) {
		return handler instanceof SimpleController;
	}

	@Override
	public void handle(Object handler) {
		((SimpleController) handler).doSimplerHandler();
	}
	
}

class HttpHandlerAdapter implements HandlerAdapter {

	@Override
	public boolean supports(Object handler) {
		return handler instanceof HttpController;
	}

	@Override
	public void handle(Object handler) {
		((HttpController) handler).doHttpHandler();
	}
	
}

class AnnotationHandlerAdapter implements HandlerAdapter {

	@Override
	public boolean supports(Object handler) {
		return handler instanceof AnnotationController;
	}

	@Override
	public void handle(Object handler) {
		((AnnotationController) handler).doAnnotationHandler();
	}
	
}
package com.example.demo.adapter.sprringmvc;

import java.util.ArrayList;
import java.util.List;


public class DispatchServlet {
	
	public static List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();

	public DispatchServlet() {
		handlerAdapters.add(new AnnotationHandlerAdapter());
		handlerAdapters.add(new HttpHandlerAdapter());
		handlerAdapters.add(new SimpleHandlerAdapter());
	}
	
	public void doDispatch() {
		// 此处模拟SpringMVC从request取handler的对象,
		// 适配器可以获取到希望的Controller
		// HttpController controller = new HttpController();
		AnnotationController controller = new AnnotationController();
		// SimpleController controller = new SimpleController();
		// 得到对应适配器
		HandlerAdapter adapter = getHandler(controller);
		// 通过适配器执行对应的Controller对应方法
		adapter.handle(controller);
	}

	private HandlerAdapter getHandler(AnnotationController controller) {
		for (HandlerAdapter adapter : this.handlerAdapters) {
			if (adapter.supports(controller)) {
				return adapter;
			}
		}
		return null;
	}
	
	public static void main(String[] args) {
		new DispatchServlet().doDispatch();
	}
}

Descripción:
. 1) define una interfaz de adaptador a la fuente, cada controlador de modo que hay una clase correspondiente adaptador de aplicación
2) en lugar del adaptador Controller método respectivo
3), el controlador extendida, sólo se necesita añadir una clase adaptador para completar la clase SpringMVC clase extendida
4) este es el poder de los patrones de diseño

Notas y detalles de la adapter

1) tres llamados, se basa en src es lo forman para dar adaptador (adaptador en forma) en el anonimato.
2) clase de adaptador: la clase para dar, en los años de adaptador, es de src como clases, herencia
adaptador de objeto: El objeto es dar, en el adaptador en la src como un objeto, mantenga
el adaptador de interfaz: dar a la interfaz, en adaptador en el src como una interfaz,
3) adaptador mayor modelo a seguir es originario de interfaces incompatibles para trabajar juntos
4) el desarrollo real, para poner en práctica no rígidamente adherirse a las tres formas clásicas

Publicados 144 artículos originales · ganado elogios 32 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/zhao1299002788/article/details/104748487
Recomendado
Clasificación