適配器模式(Adapter):
適配器模式是1種行動模式,它可以把1個類的接口轉換成為另外一個所期待的另外一種接口,這樣可使本來因接口沒法在1起工作的兩個類能夠在1起工作了。適配器模式有類的適配器和對象的適配器兩種情勢,這里只介紹對象的適配器模式(與類適配器模式類似),下面為類的適配器(左)和對象適配器模式(右)的簡略類圖結構:
適配器模式所觸及的角色有適配角色、目標角色和適配器角色,具體描寫以下:
適配角色:提供需要適配轉換的接口角色。
目標角色:調用者所期待的接口。
適配器角色:把適配角色轉為目標角色的接口。
與之前1樣,我們一樣羅列1個實例來講明適配器模式的使用。在電商平臺中,查詢商品、查看商品詳情、添加購物車和支付是最多見不過了。假設原系統(tǒng)中已實現(xiàn)了商品的查詢、添加購物車和支付功能,查詢功能包括查詢商品、查看詳情、和計算商品總價;添加購物車包括查看詳情、商品添加購物車和支付,目前這兩個模塊功能是不協(xié)同工作的,所以下面我們將會把購物車適配成為可以與查看商品1起工作,實現(xiàn)他們的1體化操作。那末他們的詳細結構類圖以下所示:
好了,下面羅列下適配器模式的核心代碼。
目標角色(SaleShopCenter):
/**
* @description :
* 目標對象
*/
public interfaceSaleShopCenter {
List<Sale>scanSaleItems(String pKey);
SalescanSaleDetail(String pId);
double calculateTotalPrice();
}
適配角色(ShoppingCart):
/**
* @description :
* 適配的對象
*/
public class ShoppingCart {
private Salesale = null;
public staticList<Sale> results =null; // 摹擬緩存數(shù)據(jù)?
public Sale scanSaleDetail(StringpId) {
// 異步要求網(wǎng)絡
// TODO
// 這里摹擬實現(xiàn)
sale = getSale(pId);
return sale;
}
public voidaddSaleShoppingCart(List<Sale> sales) {
// 異步要求網(wǎng)絡
// TODO
addCart(sales);
}
public booleanbillPay(List<Sale> sales) {
// 異步要求網(wǎng)絡
// TODO
// 這里摹擬支付成功
booleanpayStatus = true;
if(null ==SaleShoppingManager.results
||0 > SaleShoppingManager.results.size()) {
payStatus = false;
}
return payStatus;
}
private Sale getSale(StringpId) {
if(null ==SaleShoppingManager.results
||0 > SaleShoppingManager.results.size()) {
return null;
}
Salesale = null;
for(Saleitem : SaleShoppingManager.results) {
if(item.getpID().equals(pId)) {
sale = item;
}
}
return sale;
}
private voidaddCart(List<Sale> sales) {
results = sales;
}
}
適配器角色(SaleShoppingManager):
/**
* @description :
* 適配器對象角色
*/
public classSaleShoppingManager implementsSaleShopCenter {
private ShoppingCartcart = null;
public staticList<Sale> results =null; // 摹擬緩存數(shù)據(jù)
public SaleShoppingManager() {
cart = new ShoppingCart();
}
@Override
public List<Sale> scanSaleItems(StringpKey) {
results = new ArrayList<Sale>();
// 異步網(wǎng)絡要求
// TODO
// 這里摹擬實現(xiàn)
results = getSales();
return results;
}
@Override
public Sale scanSaleDetail(StringpId) {
return cart.scanSaleDetail(pId);
}
@Override
public doublecalculateTotalPrice() {
if(null ==results || 0 > results.size()) {
return 0;
}
double totalPrice = 0;
for(Salesale : results) {
totalPrice += sale.getpPrice();
}
return totalPrice;
}
private List<Sale> getSales() {
List<Sale>result = new ArrayList<Sale>();
Salesale = new Sale();
sale.setpID("0000121300");
sale.setbID("1111232300");
sale.setpName("襯衫-黑領");
sale.setpPrice(123.14);
sale.setpDescri("黑色、圓領,高端大氣!");
result.add(sale);
Salesale2 = new Sale();
sale2.setpID("0000121311");
sale2.setbID("1111232311");
sale2.setpName("襯衫-黑領");
sale2.setpPrice(123.34);
sale2.setpDescri("黑色、圓領,高端大氣!");
result.add(sale2);
Salesale3 = new Sale();
sale3.setpID("0000121322");
sale3.setbID("1111232322");
sale3.setpName("襯衫-黑領22");
sale3.setpPrice(123.24);
sale3.setpDescri("黑色、圓領,高端大氣!");
result.add(sale3);
return result;
}
public ShoppingCart getCart() {
return cart;
}
}
下面為程序的運營結果圖,后面我會上傳項目代碼,感興趣的同學可以下載跑跑。效果圖以下:
好了,到這里適配器模式已介紹完了。
點擊我下載代碼!
技術交換群:179914858