今天学习了一下java中的适配器模式,在这里做个记录,方便以后查看
什么是适配器,适配就是连接源到目标的中间件,简单的例子就是我们的港水货手机充电器是大三角,我们想要在大陆正常使用我们需要一个转接充电器,那么这个接上了转接器的充电器就是适配器。
概念:适配器模式将一个接口转换成客户希望的另外一个接口。它使得原来由于接口不兼容而不能在一起工作的那些类可以一起工作。
使用场景:
开发功能需要升级,希望使用现有的类中的已有功能进行拓展,直接修改现有类也是一种方法,但这不符合系统设计高内聚、低耦合的的原则,于是我们使用适配器模式,这样就能解决系统设计前期设计上的不足(ps:开发中前期设计很重要)或者适应新出现的需求。
模式中涉及到的角色:
目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
需要适配的类(Adaptee):需要适配的类或适配者类。
适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
用代码说话:
现在我们有一个源是一个对象机器人,他的现有能力是说英语和日语,现在我们需要他能说法语,那么现在我们要将机器人适配成能够说英语日语和法语的机器人。需要怎样做呢?
已有“源”代码,机器人
public class Robot{ private String name; public void speakJapanese(){
System.out.println("I can speak Japanese!");
} public void speakEnglish(){
System.out.println("I can speak English!");
}
...
}
目标接口代码:
public interface Job { public abstract void speakJapanese();
public abstract void speakEnglish();
public abstract void speakFrench(); }
使用类适配器模式:
public class Adapter extends Robot implements Job{ public void speakFrench() {
System.out.println("I can speak French ");
} }
那么何为类适配器模式:
可以看出来在这里我们使用Adapter继承了类Robot这样我们称为类适配器
使用对象适配器模式:
public class Adapter implements Job { Robot robot ; public Adapter(Robot robot ) {
this.robot = robot ;
} public void speakEnglish() {
robot .speakEnglish();
} public void speakJapanese() {
robot .speakJapanese();
} //new add
public void speakFrench() { } }
对象的适配器模式,把“robot”作为一个构造参数传入适配器,然后执行接口所要求的方法。这种适配模式可以为多个源进行适配。
关于类适配器模式和对象适配器模式:
java(c#)不支持多重继承,所以类适配器模式只能适配单一源,对象适配器可进行多源适配
对比装饰者模式:
它们都可以用来包装对象,本质区别在于
- 适配器模式:将一个接口转换成另外一个接口。
- 装饰者模式:不改变接口,只加入职责。