design patterns java ---- mode adaptateur, plus la façon dont un tiers a atterri Interface

mode d'adaptateur (Adapter Pattern)

Il consiste à convertir l'interface d'une classe dans une autre interface attendue des clients, de sorte que l'interface d'origine n'est pas compatible avec la classe peut travailler ensemble.

Appartenant aux modèles de conception structurelle.

scène applicable:

1. classes existantes, les méthodes et le cas où il ne correspond pas à la demande.

2. Le mode de modèle de conception de l'adaptateur ne soit pas pris en compte dans la phase de conception du logiciel, ainsi que la maintenance du logiciel, en raison des différentes solutions dans les produits de différents fabricants font interface fonction similaire n'est pas la même situation.

Code scène:

Maintenant, nous devons ajouter un login tiers au système, à ajouter à conserver l'atterrissage d'origine dans le cas de l'interface inchangée.

/**
 * @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;
    }
}

Ceci est l'un des plus mode simple adaptateur, bien sûr, tout comme le mode proxy statique, parce que le modèle de conception est une idée, ne se limite pas au code, mais avec la façon dont le code pour mettre en œuvre cette idée, bien sûr, cela est certainement trop simple, donc nous sommes maintenant à l'industrie pour atteindre les moyens les plus populaires pour augmenter l'atterrissage tiers.

La première étape: Nous nous réservons le système original connexion inchangé

/**
 * @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);
    }
}

Deuxième étape: on ajoute une interface d'adaptateur, et tous les adaptateurs

/**
 * @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");
    }
}

Cela est conforme au principe de l'ouverture et la fermeture, et un autre adaptateur tiers pour résoudre les besoins de l'atterrissage, et si besoin d'autres atterrissage, il suffit de continuer à augmenter l'adaptateur sur elle.

Regardez le diagramme de classes:

look Let au modèle de stratégie printemps-aop utilisé dans:

 

 

notification des messages springAop sur l'utilisation du mode adaptateur, sélectionnez l'adaptateur que vous voulez, puis regardez après la notification avant la méthode ou les méthodes avis.

Regardez les adaptateurs ressort mvc:

 

 

Adapter ici sont principalement utilisés à l'intérieur de servlet, nous sommes intéressés peuvent se tourner vers un petit partenaire dans la doDispatch en DispatcherServlet.

Résumé:

avantages:

1. Afin d'améliorer la transparence et la réutilisation classe, le type classique ne pas besoin de changer le multiplexage.

2. classe cible Découplage et les classes adaptateur.

3. de nombreux scénarios en conformité avec le principe de l'ouverture et la fermeture.

inconvénients:

1. La nécessité de tenir pleinement compte, et il peut augmenter la complexité du système.

2. Pour augmenter la difficulté de la lecture du code, l'utilisation excessive peut rendre le code devient malpropre.

Publié 27 articles originaux · a gagné les éloges 1 · views 3639

Je suppose que tu aimes

Origine blog.csdn.net/qq_40111437/article/details/104858328
conseillé
Classement