1 解释
1.1 定义
将一个类的接口转换成客户希望的另外一个接口。
1.2 分析
定义中重点是“转换”,以下的例子都体现了适配器的原理:
1. 出国旅游,人民币必须兑换成外币才能正常的进行流通和使用。
2. 各用电设备使用电压都不一样,需要用一个变压器提供对应的电压。
3. 各国语言不一样,所以出现了翻译这么一个职业,帮助大家顺畅的沟通。
2 代码分析
2.1 买大米的故事
信用卡刷卡消费,当你在国外消费的时候,他会先扣除对应的外币,然后再转换成本国的货币扣除。这样就不需要我们再去兑换货币了,很方便。
参考上面的实例,一个美国朋友拿着一张美国卡在中国买大米。可是系统中只有美元买美国大米的功能,还没有美元买中国大米的功能。那我们就实现一个呗,如下图所示。
目标接口,客户端需要的接口:
public interface ActionTarget { public void buyRiceInDollars(int pDollarValue); public void buyRiceInRMB(int pRMBValue); }
需要适配的类:
public class RMBAdapee { public void buyRiceInRMB(int pRMBValue) { int amount = pRMBValue / 2; // 购买的动作可以放到接口或者父类中。 System.out.println("在中国,您用" + pRMBValue + "元人民币可以购买" + amount + "斤大米"); } }
适配器,该模式的核心:
public class DollarAdapter implements ActionTarget { private RMBAdapee mRMBAdapee; public DollarAdapter(RMBAdapee pRMBAdapee) { mRMBAdapee = pRMBAdapee; } public void buyRiceInDollars(int pValue) { int amount = pValue / 1; //购买的动作可以放到接口或者父类中。 System.out.println("在美国,您用" + pValue + "美元可以购买" + amount + "斤大米"); } @Override public void buyRiceInRMB(int pValue) { int rmbValue = pValue * 6; System.out.println(pValue + "美元可以兑换" + rmbValue + "元人民币"); mRMBAdapee.buyRiceInRMB(rmbValue); } }
从上面的buyRiceInRMB函数可以看出来,我们必须传入人民币才能使用这个函数。于是我们在适配器里面做一个货币的转换,然后再调用这个函数,这样就实现了用美元买中国大米的功能。
测试类:
public class AdapterTest { public static void main(String[] args) { int dollar = 10; DollarAdapter adapter = new DollarAdapter(new RMBAdapee()); adapter.buyRiceInDollars(dollar); adapter.buyRiceInRMB(dollar); } }
代码下载地址:https://github.com/bird7310/DesignPatternExample.git
包名:com.ahacool.designpattern.adapter
3 总结
本文介绍的很简单,因为这个模式很常见,只要大家理解原理即可,其他深入的学习可以查看其他的资料和书籍。
时间: 2024-10-29 16:20:05