Javaのデザインパターン----アダプタモードに加え、どのようにサードパーティ製のインターフェイスを上陸させました

アダプタモード(Adapterパターン)

これは、クライアントが期待別のインターフェイスにクラスのインタフェース変換を意味するので、元のインターフェースクラスと互換性がないこと一緒に働くことができます。

構造設計パターンに属します。

該当するシーン:

1.既存のクラス、メソッド、それは需要と一致しない場合。

同様の機能インタフェースは、同じような状況ではありません原因2.アダプターデザインパターンモードは、さまざまなメーカーから、ソフトウェアのメンテナンスと一緒に、ソフトウェアの設計段階で製品のさまざまなソリューションによるものとはみなされません。

コードのシーン:

今、私たちは変わらないインタフェースの場合は、元の着陸を維持するために追加するには、システムにサードパーティのログインを追加する必要があります。

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

これは、デザインパターンが考えですので、当然のことながら、多くの静的プロキシモードと同様に、コードに限定されるものではなく、最も簡単なアダプタモードの一つですが、コードはこのアイデアを実装する方法と、当然のことながら、これは確かにあまりにも単純です、私たちは、サードパーティの着陸を高めるために、より一般的な方法を達成するために、業界では今です。

最初のステップ:私たちは、変わらずのログイン元のシステムを予約します

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

ステップ2:我々は、アダプタインターフェース、およびすべてのアダプタを追加します

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

これは、開閉の原則と一致して、リンク先のニーズを解決するために、他のサードパーティ製のアダプタ、および必要性その他の着陸場合は、それだけにアダプタを高めるために継続する必要があります。

クラス図を見てください:

で使用される戦略パターンバネ-AOPで見てみましょう:

 

 

アダプタモードの使用上のspringAopメッセージ通知は、あなたがしたいアダプタを選択し、メソッドまたはメソッドの通知前に通知した後に見えます。

春、MVCのアダプタを見てください:

 

 

アダプタここでは主に、サーブレットの内部で使用されている、我々はDispatcherServletの中doDispatchの小さなパートナーに見ることができます興味を持っています。

要約:

利点:

1.透明性とクラス再利用を改善するために、従来のタイプは、多重化を変更する必要はありません。

2.デカップリングターゲットクラスとアダプタクラス。

開閉の原則に沿って、3。多くのシナリオ。

短所:

1.完全に考慮すべき、それはシステムの複雑さを増すことが必要。

2.コードを読むことの難しさを高めるために、過度の使用は、コードが乱雑になりことがあります。

公開された27元の記事 ウォンの賞賛1 ビュー3639

おすすめ

転載: blog.csdn.net/qq_40111437/article/details/104858328