设计模式-适配者模式
“事已至此,亡羊补牢”
何为适配器?
提高适配器,不知道你会想到什么?
也许我们会想到电源适配器,我们的笔记本电源线线上那个黑黑的小盒子就是电源适配器
电源适配器是用来解决电源接入和电源使用的差异问题
中国家庭接入的是220v的交流电,而笔记本往往使用的是小电压的直流电,因此肯定需要转换后使用
所谓适配器,就死为了解决差异化而产生的
现实例子
假设你是一个企业的老板,
现有一个不会说中文的外国客户,他需要了解产品的细节,需要产品的工程师去作详细的解答,
而工程师同样不会外语,那怎么进行交流呢?
答案很简单,当然是找翻译啊,但我们可以先分析一下其他的办法。
可以让外国客户学中文,但往往这是一个很离谱的请求,毕竟客户就是上帝,提出的时候客户就走了。
改变自己比改变别人容易,那让工程师学吧,但耗费的功夫太大了,客户不耐烦也走了。
在这个例子中,翻译就是适配者,他解决了客户和工程师之间的差异,同时又不需要让客户与工程师做修改。
代码结构
客户端接口
像客户一样,已经约定俗称,往往不方便变动
声明了抽象的业务方法
服务类
像工程师一样,对客户来说往往以为着是另一个体系
具有服务方法
适配器
像翻译一样,充当中间角色
具有服务类的成员变量
继承/实现了客户端接口,实现了业务方法,在业务方法中完成
具体代码
根据实现例子结合适配器模式编写
外国客户
/**
* 客户端接口 -> 外国客户
*/
public interface ForeignClient {
void communicate();
}
翻译
/**
* 适配者 -> 翻译
*/
public class Translater implements ForeignClient{
private LocalEngineer localEngineer = new LocalEngineer();
@Override
public void communicate() {
localEngineer.communicate();
System.out.println("翻译正在翻译给外国客户听");
System.out.println("外国客户已经理解,正在与翻译交流");
}
}
本地工程师
/**
* 服务类 -> 本地工程师类
*/
public class LocalEngineer {
public void communicate() {
System.out.println("本地工程师正在说中文");
}
}
调用与结果
public static void main(String[] args) {
ForeignClient foreignClient = new Translater();
foreignClient.communicate();
}