標籤:android 設計模式
適配器模式(Adapter):
適配器模式是一種行為模式,它可以把一個類的介面轉換成為另一個所期待的另一種介面,這樣可以使原本因介面無法在一起工作的兩個類能夠在一起工作了。適配器模式有類的適配器和對象的適配器兩種形式,這裡只介紹對象的適配器模式(與類適配器模式類似),下面為類的適配器(左)和對象適配器模式(右)的簡略類圖結構:
適配器模式所涉及的角色有適配角色、目標角色和適配器角色,具體描述如下:
適配角色:提供需要適配轉換的介面角色。
目標角色:調用者所期待的介面。
適配器角色:把適配角色轉為目標角色的介面。
與之前一樣,我們同樣列舉一個執行個體來說明適配器模式的使用。在電商平台中,查詢商品、查看商品詳情、添加購物車和支付是最常見不過了。假如原系統中已經實現了商品的查詢、添加購物車以及支付功能,查詢功能包括查詢商品、查看詳情、以及計算商品總價;添加購物車包括查看詳情、商品添加購物車以及支付,目前這兩個模組功能是不協同工作的,所以下面我們將會把購物車適配成為可以與查看商品一起工作,實現他們的一體化操作。那麼他們的詳細結構類圖如下所示:
好了,下面羅列下適配器模式的核心代碼。
目標角色(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; // 類比快取資料?
public Sale scanSaleDetail(StringpId) {
// 非同步請求網路
// TODO
// 這裡類比實現
sale = getSale(pId);
return sale;
}
public voidaddSaleShoppingCart(List<Sale> sales) {
// 非同步請求網路
// TODO
addCart(sales);
}
public booleanbillPay(List<Sale> sales) {
// 非同步請求網路
// 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; // 類比快取資料
public SaleShoppingManager() {
cart = new ShoppingCart();
}
@Override
public List<Sale> scanSaleItems(StringpKey) {
results = new ArrayList<Sale>();
// 非同步網路請求
// TODO
// 這裡類比實現
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
適配器角色在android中使用