我的笔记本电脑的工作电压是20V,而我国的家庭用电是220V,如何让20V的笔记本电脑能够在220V的电压下工作?答案是引入一个电源适配器(AC Adapter),俗称充电器或变压器,有了这个电源适配器,生活用电和笔记本电脑即可兼容
适配器模式(Adapter Pattern)
适配器模式:又叫做变压器模式,它的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够在一起工作,属于结构性设计模式。
在软件开发中,基本上任何问题都可以通过增加一个中间层来解决,适配器模式其实就是一个中间层。适配器模式起着转化/委托的作用,将一种接口转化为另一种符合需求的接口。
设计思想
对象适配器
Target(目标抽象类):定义一个客户所需要的接口,可以是一个抽象类或者接口,也可以是具体类。
Adapter(适配器类):作为一个转换器,对Adaptee和Target进行适配,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生关联。
Adaptee(适配者类):被适配的角色,定义了已经存在的接口,包含了客户希望使用的业务方法,在某些情况下没有适配者类的源代码。
类适配器
类适配器和对象适配器最大的区别在于适配器和适配者之间的关系不同,对象适配器模式中适配器和适配者之间是关联关系,而类适配器模式中适配器和适配者是继承关系。
public class Adapter implements target, extends Adaptee{
public void request(){
specificRequest();
}
}
伪代码
//目标抽象类
public interface DC5{
int outPut5V();
}
//适配者类
public class AC220{
public int outPut220V(){
int output = 220;
System.out.println("输出电压"+220+"v");
return output;
}
}
//适配器类
public class Adapter implements DC5{
AC220 ac = new AC220();
public int outPut5V(){
int out = ac.outPut220();
return out / 44;
}
}
//客户端
public class Cient{
public static void main(String[] args){
DC5 dc = new Adapter();
dc.outPut5V();
}
}
接口适配器
接口适配器的使用场景是当接口的方法过多时,如果直接实现接口,则类会多出很多空实现的方法,显得异常臃肿。如果使用接口适配器,可以只实现我们需要的接口方法,是目标更清晰。
接口适配器的主要原理就是使用抽象类实现接口,并为接口中的每个方法实现空实现。抽象类的子类可以选择性的覆盖父类的某些方法来实现需求。
public interface target{
void method1();
void method2();
void method3();
...
}
public abstract class DefaultAdapter implements target{
public void method1(){};
public void method2(){};
public void method3(){};
...
}
public class Adapter extends DefaultAdapter{
Adaptee adaptee = new Adaptee();
public void method1(){
adaptee.method();
System.out.println("我只实现这个方法.");
}
}
public class Adaptee{
public void method(){...}
}
总结
优点:
(1)将适配者类和目标类解耦,通过引入一个适配器类来重用现有的适配者类,无需修改原有结构,适配器模式主要解决的是功能兼容问题。
(2)增加了类的透明度和复用性。
(3)符合开闭原则
缺点:
(1)使用适配器需要结合业务全面考虑,可能会增加系统的复杂性
(2)增加代码的阅读难度,降低代码的可读性。
使用场景:
(1)系统需要使用一些现有的类,而这些类的接口(如方法名,返回值)不符合系统的需要,甚至没有这些类的源代码。
(2)想创建一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作