アダプタモード(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.コードを読むことの難しさを高めるために、過度の使用は、コードが乱雑になりことがあります。