结构型模式(Structural Pattern)描述如何将类或者对象结合在一起形成更大的结构,就像搭积木,可以通过简单积木的组合形成复杂的、功能更为强大的结构。
适配器模式
泰国旅游使用插座问题
现实生活中的适配器例子 :泰国插座用的是两孔的(欧标),可以买个多功能转换插头 (适配器) ,这样就可以使用了。

适配器模式基本介绍
适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)
适配器模式属于结构型模式
主要分为三类:类适配器模式、对象适配器模式、接口适配器模式
适配器模式工作原理
适配器模式:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容
从用户的角度看不到被适配者,是解耦的
用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口 方法
用户收到反馈结果,感觉只是和目标接口交互,如图

类适配器模式介绍
基本介绍:Adapter类(适配器类),通过继承 src类(被适配者),实现 dst 类接口,完成src->dst的适配。
类适配器模式
应用实例
应用实例说明 以生活中充电器的例子来讲解适配器,充电器本身相当于Adapter,220V交流电 相当于src (即被适配者),我们的dst(即 目标)是5V直流电 (如下图)

UML类图

代码示例
//被适配者
public class Voltage220V {
/**输出220V的电压*/
public int output220V(){
int src = 220;
System.out.println("电压 = " + src + "伏");
return src;
}
}
//-----------------------------------------------------------------------------
//适配器接口/抽象层
public interface IVoltage5V {
int output5V();
}
//适配器具体实现 缺点:适配器类需要继承被适配类 增加了耦合度
public class VoltageAdapter extends Voltage220V implements IVoltage5V {
@Override
public int output5V() {
//拿到220V电压
int src = output220V();
//转成5V
int dstV = src / 44;
return dstV;
}
}
//-----------------------------------------------------------------------------
//适配器调用者/使用者 结果使用者
public class Phone {
/**充电方法 iVoltage5V.output5V() 返回的结果是目标*/
public void charging(IVoltage5V iVoltage5V){
if (iVoltage5V.output5V() == 5){
System.out.println("电压为5V 可以充电 ~~");
}else {
System.out.println("电压大于5V 不能充电 ~~");
}
}
}
//-----------------------------------------------------------------------------
//客户端 测试
public class Client {
public static void main(String[] args) {
System.out.println("类适配器模式");
Phone phone = new Phone();
phone.charging(new VoltageAdapter());
}
}
类适配器模式注意事项和细节
缺点:Java是单继承机制,所以类适配器需要继承src类这一点算是一个缺点, 因为这要 求dst必须是接口,有一定局限性;
缺点:src类的方法在Adapter中都会暴露出来,也增加了使用的成本。
优点:由于其继承了src类,所以它可以根据需求重写src类的方法,使得Adapter的灵活性增强了。
对象适配器模式
基本介绍