[设计模式]适配器模式
先举个例子说明适配器模式:
A会说英语,B会说汉语,他们彼此无法和对方交流,现在C说,我充当你们的翻译。
如果把A看做是接口,B也是接口,那么C就是一个适配器,如果它能够把A的语言转化成B想要的语言,或者把B的语言转化成A想要的语言,那么它就是单向适配器,如果它能够把他们的语言互转,那么它就是双向适配器。
下面来看下UML图:
程序员得看代码才有感觉。下面上代码:
场景:一个中国人,经常生活在中国,有一天,他出国了,带着相机去美国度假去了,准备拍些照片回来,结果悲剧了,玩到一半相机没电了,但是中国的插销没有办法插进美国的插座!!!,这时候,他得去买一个转换器(在程序中就叫做适配器)了。
咱们先写一个中国式的插座标准:
package com.design.adapter;
public interface ChinaSocket {
public void ChinaSocketInfo();
}
再来一个实现:
package com.design.adapter;
public class ChinaSocketInstance implements ChinaSocket {
public void ChinaSocketInfo() {
System.out.println("您正在使用中国插座!");
}
}
接下来写一个美国插座的标准:
package com.design.adapter;
public interface AmericaSocker {
public void AmericaSockerInfo();
}
再来一个实现:
package com.design.adapter;
public class AmericaSockerInstance implements AmericaSocker {
public void AmericaSockerInfo() {
System.out.println("您正在使用霉国插座");
}
}
现在两种插座都有了,但是就是不能用.不急,咱们自己弄一个转换器.
package com.design.adapter;
public class ChinaSocketAdapter implements ChinaSocket {
//这个地方只所以使用接口,可以在使用的时候动态地指定实现类,实现运行时多态。
private AmericaSocker americaSocker;
public void ChinaSocketInfo() {
americaSocker.AmericaSockerInfo();
}
//构造函数
public ChinaSocketAdapter(AmericaSocker americaSocker) {
this.americaSocker = americaSocker;
}
}
下面咱们测试一下能不能使用美国的插座给相机充电.
package com.design.adapter;
public class TestSockerAdapter {
/**
* 在这里,咱们就把霉国的插座变成了中国的插座,厉害吧!
* 这就是传说中的适配器模式,很简单吧!
*/
public static void main(String[] args) {
System.out.println("开始使用美国-->中国的电源转换器!");
AmericaSocker americaSocker=new AmericaSockerInstance();
ChinaSocketAdapter chinaSocketAdapter=new ChinaSocketAdapter(americaSocker);
chinaSocketAdapter.ChinaSocketInfo();
}
}
最后来看下结果,看到底充成电了没有.
开始使用美国-->中国的电源转换器!
您正在使用霉国插座
好了,大功告成!收功~!今天下午继续去拍照去!