Adapter模式:分为类适配器和对象适配器<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
简单的描述:就是一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
显示数据
TargetClass |
图形适配器(显卡)
Adapter |
显示器
client |
我们知道显示器(Client)是用来显示图形的,它是不能显示数据,它只能够接受来自图形发送设备Target的信号。可是我们手头上只有CPU(Adaptee)这个产生各种描述图形的数据的数据发送器。我们需要将这些数据让显示器进行显示,可是这两个部件却是不兼容的。于是我们需要一个中间设备,它能够将CPU“适配”于显示器,这便是我们的显卡——图形适配器(Adapter)。
【1】:类适配器(class adapter)
类适配器是通过继承类适配者类(Adaptee Class)实现的,另外类适配器实现客户类所需要的接口,当客户对象调用适配器类方法的时候,适配器内部调用它所继承适配者的方法
现建立一个信号(TargetClass)类
/**
* 图形发送设备
* @author xp
* @Application 使用类适配器来实现
*/
<1>:public class TargetClass {
public String request(String str) {
return "come form class adapter Graphic data";
}
/**
* cpu输出的数据
* @author xp
* @Application 类适配器实现
* @use 适配的一个类
*/
<2>:public class AdapteeClass {
public String string;
public String getData(String str) {
this.string = str;
System.out.println(string);
return string;
}
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
}
适配器类
/**
* 显卡,即我们的适配器
* @author xp
*
*/
<3>:public class AdapterClass extends TargetClass{
private AdapteeClass ac = new AdapteeClass();
public String request(String str) {
return ac.getData(str);
}
}
这个适配器类显示继承了TargetClass ,然后又重写了TargetClass中的一个方法,在这个方法当中调用适配者的方法。
<4>:/**
* 显示器
* @author xp
*
*/
public class ClientClass {
public ClientClass() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
/**
* 类适配器模式
* 通过实例化子类来追溯到其父类
*/
TargetClass target = new AdapterClass();
target.request("come from class Adapter cpu data");
}
}
【2】:对象适配器(object adapter)
对象适配器包含一个适配器者的引用(reference),与类适配器相同,对象适配器也实现了客户类需要的接口。当客户对象调用对象适配器的方法的时候,对象适配器调它所包含的适配器者实例的适当方法。
其实我们可以对上面的类适配器的代码稍作改动就可以是对象适配器了。
/**
* 图形发送设备
* @author xp
*/
public class TargetObject {
public String request() {
return "Graphic sender";
}
}
/**
* cpu输出的数据
* @author xp
*
*/
public class AdapteeObject {
public String getData() {
return "cpu data";
}
}
主要来看这个适配方法
/**
* 显卡,即我们的适配器
* @author xp
*
*/
public class AdapterObject extends TargetObject{
/**
* 被代理的设备
*/
private AdapteeObject apt = null;
/**
* 装入被代理的设备
*/
public AdapterObject (AdapteeObject apt) {
this.apt = apt;
}
/**
* 被代理的设备传过来的数据转换成图形输出
*/
public String request() {
return apt.getData();
}
}
/**
* 显示器
* @author xp
*
*/
public class ClientObject {
public ClientObject() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
/**
* cpu经过显卡的适配后变成图形发送装置了
*/
TargetObject target = new AdapterObject(new AdapteeObject());
System.out.println(target.request());
}
}
总结:
类适配器(Class Adapter) 对象适配器(Object Adapter)
基于继承概念 利用对象合成
只能应用在适配者是接口,不能利用其它子类的接口,当类适配器建立时,它就静态地与适配者关联 、可以应用于适配者的接口和它的所有子类,因为适配器是作为适配者的子类,所以适配器可能会重载适配者的一些行为。
注意:在JAVA中,子类不能重载父类中声明为final的方法。不能重载适配者的方法。
注意:字面上,不能重栽只是因为没有继承。但是适配器提供包装方法可以按需要改变行为。
客户类对适配者中声明为public的接口是可见的, 客户类和适配者是完全不关联的,只有适配器才能感知适配者接口。
类适配器(Class Adapter) 对象适配器(Object Adapter)
基于继承概念 利用对象合成
只能应用在适配者是接口,不能利用其它子类的接口,当类适配器建立时,它就静态地与适配者关联 、可以应用于适配者的接口和它的所有子类,因为适配器是作为适配者的子类,所以适配器可能会重载适配者的一些行为。
注意:在JAVA中,子类不能重载父类中声明为final的方法。不能重载适配者的方法。
注意:字面上,不能重栽只是因为没有继承。但是适配器提供包装方法可以按需要改变行为。
客户类对适配者中声明为public的接口是可见的, 客户类和适配者是完全不关联的,只有适配器才能感知适配者接口。
在JAVA应用程序中:
适用于期待的接口是JAVA接口的形式,而不是抽象地或具体地类的形式。这是因为JAVA编程语言只允许单继承不允许多继承。因此,类适配器设计成适配者的子类。 在JAVA应用程序中:适用于当客户对象期望的接口是抽象类的形式,同时也可以应用于期望接口是Java接口的形式
转载于:https://blog.51cto.com/485567/98439