java patrones de diseño ---- modo de adaptador, además de la forma de terceros aterrizó Interfaz

modo de adaptador (adapter)

Se refiere a la conversión de la interfaz de una clase en otra interfaz clientes esperan, por lo que la interfaz original no es compatible con la clase pueden trabajar juntos.

La pertenencia a los patrones de diseño estructural.

escena aplicable:

1. existentes clases, métodos y el caso en que no se corresponde con la demanda.

el modo de patrón de diseño 2. El adaptador no se considera en la fase de diseño del software, junto con el mantenimiento de software, debido a las diferentes soluciones en productos de diferentes fabricantes causan interfaz de función similar no es la misma situación.

Escena código:

Ahora tenemos que añadir datos de acceso de terceros al sistema, para añadir a retener el destino original en el caso de la interfaz sin cambios.

/**
 * @Author Darker
 * @Descrption
 * @Date : Created in 16:07 2020-3-12
 */
@Data
@AllArgsConstructor
public class MsgResult {

    private int code;
    private Object data;
    private String msg;

    public static MsgResult success(Object data){
        return new MsgResult(200,data,"成功");
    }

    public static MsgResult fail(Object data){
        return new MsgResult(404,data,"失败");
    }
}

/**
 * @Author Darker
 * @Note 我心净处,何处不是西天。
 * @Descrption  相当于系统已经写好的代码,不去动它
 * @E-Mail : [email protected]
 * @Date : Created in 13:38 2020-3-14
 */
public class LoginService {

    //用户名,密码登陆方法
    public MsgResult login(String username,String password){
        return null;
    }

    //注册方法
    public MsgResult register(String username,String password){
        return login(username,password);
    }
}

/**
 * @Author Darker
 * @Note 我心净处,何处不是西天。
 * @Descrption 新的登陆接口
 * @E-Mail : [email protected]
 * @Date : Created in 14:02 2020-3-14
 */
public interface NewLogin {

    public MsgResult loginQQ(String id);

    public MsgResult loginWechat(String id);
}

/**
 * @Author Darker
 * @Note 我心净处,何处不是西天。
 * @Descrption 适配器方式
 * @E-Mail : [email protected]
 * @Date : Created in 13:54 2020-3-14
 */
public class LoginForThird extends LoginService implements NewLogin{


    @Override
    public MsgResult loginQQ(String id) {
        System.out.println("通过qq登陆");
        return null;
    }

    @Override
    public MsgResult loginWechat(String id) {
        System.out.println("通过微信登陆");
        return null;
    }
}

Este es uno de los modos adaptador de la mayoría simple, por supuesto, al igual que el modo de proxy estático, ya que el patrón de diseño es una idea, no se limita al código, pero con la forma en que el código para poner en práctica esta idea, por supuesto, esto es sin duda demasiado simple, por lo que estamos ahora en la industria para lograr las maneras más populares para aumentar el aterrizaje de terceros.

El primer paso: Nos reservamos el sistema original de inicio de sesión sin cambios

/**
 * @Author Darker
 * @Note 我心净处,何处不是西天。
 * @Descrption  相当于系统已经写好的代码,不去动它
 * @E-Mail : [email protected]
 * @Date : Created in 13:38 2020-3-14
 */
public class LoginService {

    //用户名,密码登陆方法
    public MsgResult login(String username,String password){
        System.out.println("用户pc登陆");
        return null;
    }

    //注册方法
    public MsgResult register(String username,String password){
        return login(username,password);
    }
}

Paso dos: añadimos una interfaz de adaptador y todos los adaptadores

/**
 * @Author Darker
 * @Note 我心净处,何处不是西天。
 * @Descrption 在适配器中,这个接口可有可无,不要和模板模式混淆
 *              模板模式一定是抽象类,这里只是一个接口
 * @E-Mail : [email protected]
 * @Date : Created in 14:38 2020-3-14
 */
public interface LoginAdapter {

    //判断是否是需要调用的适配器,是否兼容
    /**
     * 为什么要这个方法,因为适配器可能会有多个,比如再来个注册适配器
     * @param adapter
     * @return
     */
    boolean support(Object adapter);

    public MsgResult login(String id,Object adapter);
}
/**
 * @Author Darker
 * @Note 我心净处,何处不是西天。
 * @Descrption
 * @E-Mail : [email protected]
 * @Date : Created in 14:41 2020-3-14
 */
public class LoginQQAdapter implements LoginAdapter{
    @Override
    public boolean support(Object adapter) {
        return adapter instanceof LoginQQAdapter;
    }

    @Override
    public MsgResult login(String id, Object adapter) {
        //写自己qq登陆的逻辑
        System.out.println("通过qq登陆");
        return null;
    }
}

/**
 * @Author Darker
 * @Note 我心净处,何处不是西天。
 * @Descrption
 * @E-Mail : [email protected]
 * @Date : Created in 14:42 2020-3-14
 */
public class LoginWechatAdapter implements LoginAdapter {
    @Override
    public boolean support(Object adapter) {
        return adapter instanceof LoginWechatAdapter;
    }

    @Override
    public MsgResult login(String id, Object adapter) {
        //写微信自己登陆的逻辑
        System.out.println("通过微信登陆");
        return null;
    }
}


/**
 * @Author Darker
 * @Note 我心净处,何处不是西天。
 * @Descrption
 * @E-Mail : [email protected]
 * @Date : Created in 13:54 2020-3-14
 */
public class LoginForThird extends LoginService implements NewLogin{


    //这里可以继续使用策略模式来优化
    @Override
    public MsgResult loginQQ(String id) {
        return loginAdapterFactory(id,LoginQQAdapter.class);
    }

    @Override
    public MsgResult loginWechat(String id) {
        return loginAdapterFactory(id,LoginWechatAdapter.class);
    }

    //简单工厂
    public MsgResult loginAdapterFactory(String id,Class <? extends LoginAdapter> clazz){
        try {
            LoginAdapter adapter = clazz.newInstance();
            if(adapter.support(adapter)){
                return adapter.login(id,adapter);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return MsgResult.fail(null);
    }
}

/**
 * @Author Darker
 * @Note 我心净处,何处不是西天。
 * @Descrption
 * @E-Mail : [email protected]
 * @Date : Created in 17:55 2020-3-13
 */
public class AdapterTest {
    public static void main(String[] args) {
        LoginForThird loginForThird = new LoginForThird();
        loginForThird.login("xiaoming","123456");
        loginForThird.loginQQ("dsadas");
        loginForThird.loginWechat("1556");
    }
}

Esto es consistente con el principio de apertura y cierre, y otro adaptador de terceros para resolver las necesidades del aterrizaje, y si necesita el otro aterrizaje, sólo tendrá que seguir aumentando adaptador en él.

Mira el diagrama de clases:

Echemos un vistazo al patrón de estrategia de primavera-AOP utiliza en:

 

 

springAop mensajes de notificación en el uso del modo de adaptador, seleccione el adaptador que desea, y luego cuidar de la notificación antes de que el método o métodos de aviso.

Mira los adaptadores de primavera-mvc:

 

 

Adaptador Aquí se utilizan principalmente en el interior de servlets, estamos interesados ​​pueden esperar un socio pequeño en el doDispatch en DispatcherServlet.

resumen:

ventajas:

1. Para mejorar la transparencia y la clase de la reutilización, el tipo convencional no es necesario cambiar la multiplexación.

2. clase de objetivo y adaptador clases de desacoplamiento.

3. muchos escenarios en línea con el principio de apertura y cierre.

desventajas:

1. La necesidad de considerar totalmente, y puede aumentar la complejidad del sistema.

2. Para aumentar la dificultad de la lectura del código, el uso excesivo puede hacer que el código se vuelve desordenado.

Publicado 27 artículos originales · ganado elogios 1 · vistas 3639

Supongo que te gusta

Origin blog.csdn.net/qq_40111437/article/details/104858328
Recomendado
Clasificación