适配器模式

来源:互联网 发布:网络推手阿建推网红 编辑:程序博客网 时间:2024/06/03 18:16

适配器模式

         适配器模式,一个中间类来支撑的模式。A和B之间需要有一些互动,比如A是法国人,B是土耳其人,A想和B通话,但是没有B不会法语,A不会土耳其语,这个时候需要一个翻译,这个翻译来作为中间的桥梁给他们两个分别翻译为法语与土耳其语。苹果电脑连接显示器的雷电转接口。这些都是可以用适配器来实现的。
适配器就是将一个类的接口转化为客户希望的另一个接口,是的原来由于接口不兼容而不能一起工作的类可以一起工作。
比如在你目前的项目中有这样一个场景,在以前的时候数据库中这样存放了一个产品,

public class ProductA {


privatelong item_id;

private Stringitem_name;

privatefloat price;

private Stringunit;

public ProductA(longitem_id, String item_name,float price, Stringunit) {

super();

this.item_id =item_id;

this.item_name =item_name;

this.price =price;

this.unit =unit;

}

public long getItem_id() {

returnitem_id;

}

public void setItem_id(long item_id) {

this.item_id =item_id;

}

public String getItem_name() {

returnitem_name;

}

public void setItem_name(String item_name) {

this.item_name =item_name;

}

public float getPrice() {

returnprice;

}

public void setPrice(float price) {

this.price =price;

}

public String getUnit() {

returnunit;

}

public void setUnit(String unit) {

this.unit =unit;

}

@Override

public String toString() {

// TODO Auto-generated method stub

return"item_id:"+item_id+"\titem_name:"+item_name+"\tprice:"+price+"\tunit:"+unit;

}

}


而在项目对接中你们使用了这样的产品类ProductB

public class ProductB {


private StringitemId;

private Stringprice;

private StringitemName;

private StringitemUnit;

public ProductB() {

super();

// TODO Auto-generated constructor stub

}


public ProductB(StringitemId, String price, StringitemName, String itemUnit) {

super();

this.itemId =itemId;

this.price =price;

this.itemName =itemName;

this.itemUnit =itemUnit;

}


public String getItemId() {

returnitemId;

}

public void setItemId(String itemId) {

this.itemId =itemId;

}

public String getPrice() {

returnprice;

}

public void setPrice(String price) {

this.price =price;

}

public String getItemName() {

returnitemName;

}

public void setItemName(String itemName) {

this.itemName =itemName;

}

public String getItemUnit() {

returnitemUnit;

}

public void setItemUnit(String itemUnit) {

this.itemUnit =itemUnit;

}

@Override

public String toString() {

// TODO Auto-generated method stub

return"itemID:"+itemId+"\titemName:"+itemName+"\tprice:"+price+"\tunit:"+itemUnit;

}

}

这时为了简单的在不动原代码的前提下实现你们两端的数据互通有无,就需要适配器将数据转换这里有一个比较简单的转换器

public class ProductA2BAdapter {


private ProductAproductA;

public ProductA2BAdapter(ProductAproductA) {

this.productA =productA;

}





public ProductB transform() {

ProductB productB =new ProductB();

productB.setItemId(String.valueOf(productA.getItem_id()));

productB.setPrice(String.valueOf(productA.getPrice()));

productB.setItemUnit(productA.getUnit());

productB.setItemName(productA.getItem_name());

returnproductB;

}

}

在demo中使用

public static final void main(String[]args){

ProductA productA =new ProductA(289796235415l, "hat", 15f, "Pice");

System.out.println(productA.toString());

ProductA2BAdapter a2bAdapter = new ProductA2BAdapter(productA);

ProductB productB =a2bAdapter.transform();

System.out.println(productB.toString());

}

输出结果

item_id:289796235415 item_name:hatprice:15.0 unit:Pice

itemID:289796235415 itemName:hatprice:15.0 unit:Pice


是不是就可以解决了从A部门到B部门之间的转换,你也可以写一个比较通用的方法,这样只需要一个适配器对象就可以实现批量的产品转换,如果数据量比较大对象比较复杂还可以加上原型模式。

适配器模式是为了解决在原有基础上开发的问题,如果在一开始A和B两个部门就可以沟通使用同一个模型就不会有这种事。所以事前就考虑好这种问题的话就不会出现这个问题。