设计模式6——适配器模式


解释

1.1  定义

将一个类的接口转换成客户希望的另外一个接口。


1.2  分析

定义中重点是“转换”,以下的例子都体现了适配器的原理:

1. 出国旅游,人民币必须兑换成外币才能正常的进行流通和使用。

2. 各用电设备使用电压都不一样,需要用一个变压器提供对应的电压。

3. 各国语言不一样,所以出现了翻译这么一个职业,帮助大家顺畅的沟通。


代码分析

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 总结

本文介绍的很简单,因为这个模式很常见,只要大家理解原理即可,其他深入的学习可以查看其他的资料和书籍。

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值