适配器模式(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
原文地址:http://blog.csdn.net/why_2012_gogo/article/details/45420603