定义:将一个类的接口,转换成客户期望的另一个接口。当需要用一个现有的类而其接口并不符合你的需要时就用适配器。属于结构性设计模式
适用场景:
- 已经存在的类它的方法和需求不匹配
- 适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决方案
首先来个类图:
这个类图够简单但是充满了良好的OO设计原则,使用对象组合,以修改的接口包装被适配者:被适配者的任何子类都可以搭配着适配器使用。
//一个已经存在的类220v充电器
public class AC220 {
public int outputAC220(){
int output = 220;
System.out.println("输出交流电压"+output+"V");
return output;
}
}
// 一个直流电压5v
public interface DC5 {
int outputDC5V();
}
//220v适配5v适配器
// 将一个类的接口AC220,转换成客户期望的另一个接口DC5
public class PowerAdapter implements DC5 {
//适配器模式将一个对象包装起来以改变其接口
private AC220 ac220;
public PowerAdapter(AC220 ac220){
this.ac220 = ac220;
}
@Override
public int outputDC5V() {
int adapterInput = ac220.outputAC220();
//变压器...
// 适配器使用被适配者接口把请求转换成被适配者的一个或多个调用接口
int adapterOutput = adapterInput/44;
System.out.println("使用 PowerAdapter 输入 AC:"+adapterInput+"V"+"输出DC:"+adapterOutput+"V");
return adapterOutput;
}
}
public class DCAdapterTest {
public static void main(String[] args) {
//客户通过调用目标接口适用适配器的方法对适配器发出请求
DC5 dc5 = new PowerAdapter(new AC220());
dc5.outputDC5V();
}
}
适配器模式UML:
总结一把:适配器模式将一个对象包装起来以改变其接口。装饰者将一个对象包装起来以增加新的行为和责任。而外观将一群对象包装起来以简化接口。
外观模式定义:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义 了一个高层接口,让子系统更容易使用。
来个图:
public class HomeTheaterFacade{
Tuner tuner;
DvdPlayer dvdplayer;
CdPlayer cdplayer;
Screen screen;
public HomeTheaterFacade(Tuner tuner,DvdPlayer dvdplayer,
CdPlayer cdplayer,Screen screen){
this.tuner=tuner;
this.dvdPlayer=dvdPlayer;
this.cdPlayer=cdPlayer;
this.screen=screen;
//外观将子系统的组件引入构造器中
}
public void watchMovie(){
tuner.on();
dvdPlayer.on();
dvdPlayer.setDvd();
cdplayer.setCd();
screen.down();
//将子系统的组件整合成一个统一的接口
}
}
记住:外观不止是简化了接口,也将客户从组件的子系统中解耦。这也就是最少知识原则。外观和适配器可以包装很多类,但是外观的意图是简化接口,而适配器的意图是将接口转换成不同的接口。
最少知识原则:就任何对象而言,在该对象的方法内,我们只调用如下方法。
- 该对象本身
- 被当做方法的参数传进来的对象
- 此方法所创建的或者实例化的对象
- 对象的任何组件