适配器模式简介
适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适用场景:
1、已经存在的类的接口不符合我们的需求;
2、创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作;
3、在不对每一个都进行子类化以匹配它们的接口的情况下,使用一些已经存在的子类。
适配器举例
举一个例子,中国是220v电压,美国日本是110v电压,当我们买一些美版,日版手机时带来的问题就是充电的时候需要使用电源转换器帮我们实现充电功能,下面使用代码来实现以上例子。
结果:
其实现方式主要有两种:
1.类的适配器模式(采用继承实现)
目标角色(target):这就是所期待得到的接口,由于是类适配模式,目标不可以是类。
源角色(adaptee):现在需要适配的接口。
适配角色(adapter):适配模式的核心,把源接口转换成目标接口,这一角色不可以是接口,而必须是具体类。
//目标角色
public interface Target {
//源类也有的方法
void method1();
//源类没有的方法
void method2();
}
public class Adaptee {
//源类含有的方法
public void method1() {
}
}
//适配器角色扩展了源类,同时实现了目标接口
由于源角色没有method2,而目标接口又需要这个方法,所有适配器类实现了这个方法。
public class Adapter extends Adaptee implements Target {
@Override
public void method2() {
// TODO Auto-generated method stub
}
}
2.对象适配器(采用对象组合方式实现)
目标角色:这就是所期待得到的接口,目标可以是具体的或者抽象的类。
源角色:现在需要适配的接口。
适配角色:适配模式的核心,把源接口转换成目标接口,这一角色不可以是接口,而必须是具体类。
interface Target {
public void request();
}
// 已存在的、具有特殊功能、但不符合我们既有的标准接口的类
class Adaptee {
public void specificRequest() {
System.out.println("被适配类具有 特殊功能...");
}
}
// 适配器类,直接关联被适配类,同时实现标准接口
class Adapter implements Target{
// 直接关联被适配类
private Adaptee adaptee;
// 可以通过构造函数传入具体需要适配的被适配类对象
public Adapter (Adaptee adaptee) {
this.adaptee = adaptee;
}
public void request() {
// 这里是使用委托的方式完成特殊功能
this.adaptee.specificRequest();
}
}
// 测试类
public class Client {
public static void main(String[] args) {
// 使用普通功能类
Target concreteTarget =new ConcreteTarget();
concreteTarget.request();
// 使用特殊功能类,即适配类,
// 需要先创建一个被适配类的对象作为参数
Target adapter =new Adapter(new Adaptee());
adapter.request();
}
}
两种适配器适用情形:
如果不准备实现一个接口的所有方法时,就可以采用此模式。(类适配器)
适配器模式属于一种补偿模式,专用来在系统后期扩展、修改时所用(对象适配器)
网友评论