设计模式系列3---搞转换的适配器模型

用过苹果手机的人对这两样东西应该很熟悉

enter image description here enter image description here

我们常常需要买多左边那个适配器来用,要不然以苹果这插头,没几个排插能插上的。
但有了这转换器的话,只要满足两端标准,就可以循环利用,很”环保”.

例如这样: enter image description here — 或者这个: enter image description here

想当年的巴别塔,如果有这样的做语言转换的翻译人,估计也建好了把。

起航

说这个转换器和排插,是因为今天要讲的适配器模型就和这个类似的道理 。
就让我们来举个例子看下怎么写适配器

假设: 小周要去米国读书,学校说你学费得给我交美元,没办法,在国外混,还是得准备点美国币美刀好,所以小周跑去银行用人民币换点美元,这样就能交学费上学啦。

这样我们就可以简单这样理解,人民币进银行 ,美元出。
有种白刀子进去红刀子出来的感觉。

所以我们这样设计下这个流程

public static void main(String[] args) {

    Rmb myRmb = new Rmb(600);//小周从外婆借来的600块人民币
    BankOfChina bankOfChina = new BankOfChina();//当地有中国银行可以换美钞      
    Dollar myTuition = bank.changeRmb2Dollar(myRmb);//同银行换美刀;

}

好了我们的流程大概就是这样,这样小周同学就成功的把人民币换成了美元,可以开开心心的背着书包去上学了。具体的类如下

public class BankOfChina implements Rmb2DollarInterface {

    @Override
    public Dollar changeRmb2Dollar(Rmb myRmb) {
        Dollar dollar = new Dollar();
        dollar.setCount(myRmb.getCount() / 6);
        return dollar;
    }
}

public interface Rmb2DollarInterface {

    Dollar changeRmb2Dollar(Rmb rmb);
}

public class Rmb {
    private int count;

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
} 

public class Dollar {
    private int count;

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}

是不是感觉还挺简单的样子呢?


在我们实际的开发中,这个“银行”做的就是进行不兼容的类似转换的场景,他熟悉两边的情况,而两边各不认识彼此的。
就像英国的老牌绅士们,两个绅士是不会主动打招呼的,除非有第三个人认识两人,才有可能发生联系。

在我们安卓的开发过程中,也经常遇到的最常见的当然就是适配器Adapter啦。我们的ListView要的是一个个的View,但我们给Adapter送的平常都是一堆的bean,他负责去把各种bean变成各种View,说的就是下面这种情况

@Override
public View getView(int position, View convertView) {
    final ViewHolder holder;
    if (convertView == null) {
        holder = new ViewHolder();
        convertView = mInflater.inflate(R.layout.list_item_weather, null);
        holder.tvTitle = (TextView) convertView.findViewById(R.id.dv_title_tv);
        holder.tvDesc = (TextView) convertView.findViewById(R.id.dv_desc_tv); 
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    DrawItem item = mList.get(position);
    holder.tvTitle.setText(item.getTitle());
    holder.tvDesc.setText(item.getDesc());
    return convertView;
}

当然了,实际我们是可以扔不同的 bean的,他只要求有统一的返回输出就好了。

热评文章