Adapter(适配器)
意图:
将一个类的接口转换成客户希望的另外一个接口,Adapter接口模式使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作。
使用情况:
你想使用一个已经存在的类,而它的接口不符合你的需求
你想创建一个可以复用的类,该类可以与其他不相关的类或者不可以预见的类(即那些接口可能不一定兼容的类)协同工作。
(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都子类化以匹配它们的接口,对象适配器可以适配它的父类接口。
结构:
1——类适配器
2——对象适配器
class Adaptee {
public void specificRequest() {
System.out.println("被适配类具有 特殊功能...");
}
}
interface Target {
public void request();
}
class ConcreteTarget implements Target {
public void request() {
System.out.println("普通类 具有 普通功能...");
}
}
class Adapter extends Adaptee implements Target {
public void request() {
super.specificRequest();
}
}
public class AdapterMethod {
public static void main(String[] args) {
Target concreteTarget = new ConcreteTarget();
concreteTarget.request();
Target adapter = new Adapter();
adapter.request();
}
}
这里是网上比较普遍的代码。他是使用接口和继承来实现类适配器。如果想实现对象适配器就不能按照上面的做法。因为在对象适配器中Adapter和Adaptee是关联而不是继承。
package hello;
class Adaptee {
public void specificRequest() {
System.out.println("被适配类具有 特殊功能...");
}
}
interface Target {
public void request();
}
class ConcreteTarget implements Target {
public void request() {
System.out.println("普通类 具有 普通功能...");
}
}
class Adapter implements Target {
Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee=adaptee;
}
public void request() {
this.adaptee.specificRequest();
}
}
public class AdapterMethod {
public static void main(String[] args) {
Target concreteTarget = new ConcreteTarget();
concreteTarget.request();
Adaptee adaptee=new Adaptee();
Target adapter = new Adapter(adaptee);
adapter.request();
}
}
这样才比较符合结构图。
两者的输出都是:
普通类 具有 普通功能...
被适配类具有 特殊功能...