針對介面卡模式,在之前的總結中只是總結了適配的幾種方式,但是例項過為簡單(原有的例項也參考了相關部落格),介面卡模式初探,這些並不全面,這篇部落格中再次總結介面卡模式。
想來想去,還是以現在的多方登入介面來說明介面卡模式。
先寫乙個簡單的登入註冊(簡單的模擬)
/**
* autor:liman
* comment:已經正常執行的登入註冊邏輯
*/public class siginservice
public void register(string username,string password)
}
這個簡單的登入,或許是我們最簡單的想法,無非就是校驗使用者名稱和密碼,然後登入成功即可。
package com.learn.designmodel.adapterpattern.self;
/** * autor:liman
* comment: 新的登入標準,常見的第三方登入
*/public inte***ce iloginforthird
為了相容兩種模式,我們一般會這樣處理,編寫乙個介面卡的類,適配原有的登入註冊和新的第三方賬號登入
1、新的登入類如下:
qq登入方式
/**
* autor:liman
* comment:
*/public class qqlogin
}
/**
* autor:liman
* comment:
*/public class wechatlogin
}
介面卡類的實現方式
/**
* autor:liman
* comment: 真正的介面卡,繼承原有的類,同時實現新標準的介面
*/public class siginserviceadapter extends siginservice implements iloginforthird
@override
public void loginforwechat(string username, string password)
/*** 相容原來的登入流程
* @param username
* @param password
*/public void login(string username,string password)
}
簡單的測試
public class loginadaptertest
}
使用新的介面卡類,能順利完成qq賬號登入(其實這種擴充套件,似乎用**模式更為合理。這裡為了說明適配模式,就用適配的方式了) 。
1、先修改iloginforthird
package com.learn.designmodel.adapterpattern.self;
/** * autor:liman
* comment: 新的登入標準,常見的第三方登入
*/public inte***ce iloginforthird
2、同時針對介面卡類也需要實現新的方法
* comment: 真正的介面卡,繼承原有的類,同時實現新標準的介面
*/public class siginserviceadapter extends siginservice implements iloginforthird
@override
public void loginforwechat(string username, string password)
@override
public void loginforsina(string username, string password)
@override
public void loginfortaobao(string username, string password)
@override
public void loginforaalipay(string username, string password)
/*** 相容原來的登入流程
* @param username
* @param password
*/public void login(string username,string password)
}上述能完成基本的擴充套件,但是是不是覺得重複**過多?
1、各種登入抽象乙個介面,並且增加判斷方法
import com.learn.designmodel.adapterpattern.resultmsg;
/** * autor:liman
* comment:
*/public inte***ce iloginadapter
2、同時讓原有的第三方登入實現這個介面
/**
* autor:liman
* comment:
*/public class qqlogin implements iloginadapter
@override
public resultmsg login(string username, string password)
}
這裡增加了判斷型別是否相容。support方法中實現了這個邏輯(在spring原始碼中的介面卡貌似加入了這個判斷方式)
package com.learn.designmodel.adapterpattern.self;
import com.learn.designmodel.adapterpattern.resultmsg;
/** * autor:liman
* comment: 真正的介面卡,繼承原有的類,同時實現新標準的介面
*/public class siginserviceadapter extends siginservice implements iloginforthird
@override
public void loginforwechat(string username, string password)
@override
public void loginforsina(string username, string password)
@override
public void loginfortaobao(string username, string password)
@override
public void loginforaalipay(string username, string password)
/*** 優化後的登入方法,可以利用反射獲取其他第三方賬號登入方式
* @param username
* @param password
* @param clazz
* @return
*/private resultmsg processlogin(string username,string password , class extends iloginadapter> clazz)
} catch (exception e)
return null;
}/**
* 相容原來的登入流程
* @param username
* @param password
*/public void login(string username,string password)
}
測試例項不用改,這裡不止用到了介面卡模式,而是加入了類似策略模式的適配方式,其實還可以進一步優化,加入模板方式可以更加精簡**,但是這裡不打算進一步操作。
介面卡模式其實太多可以說的地方,上述例項中的類圖,只給出原有的登入實體類,新的登入介面,adapter三者的關係。
其實介面卡模式並不能使用過多,使用過多會讓**變得更加凌亂。但是卻能相容原有的老**。在**重構過程中用的較多,上述例項中適配類持有原來**邏輯的方式是繼承,其實也可以通過構造屬性來完成,這個在原來的部落格中已經做過總結,這裡不再贅述。只是本文中的例項在介面卡的方式上加入了類似策略模式的思想,例項有些許複雜,文章梳理偏亂。
介面卡模式(類介面卡 物件介面卡)
做個筆記 引用 public inte ce usb public inte ce psp public class usber implements usb 類介面卡 psp適用usb介面 public class usbadapter extends usber implements psp 物...
介面卡模式 預設介面卡,類介面卡,物件介面卡
模式思想 改變乙個類的對外介面 增加或減少 以滿足不同外部呼叫者的需求 角色成員 目標介面 target 客戶所期待的介面。目標可以是具體的或抽象的類,也可以是介面。需要適配的類 adaptee 需要適配的類或適配者類。介面卡 adapter 通過包裝乙個需要適配的物件,把原介面轉換成目標介面。適配...
設計模式 介面卡模式 類介面卡 物件介面卡
乙個小例子,便於理解,上 這是我們造的。現在想用這個方法。public class adaptee 類介面卡。對我們想要的方法封裝一下,target就能像之前一樣,呼叫request方法即可。public class adapter1 extends adaptee implements targe...