java设计模式——适配器模式
适配器模式的成员
(1)目标(target):目标是一个接口,该接口是客户想要使用的接口
(2)适配器(adapter):适配器是一个类,该类实现了目标接口和被适配者接口(这属于类适配器)。或者是:适配器类实现了目标接口,而与被适配者接口直接关联(这属于对象适配器:相对于类适配器更为灵活)。总而言之:适配器的职责是对被适配者接口与目标接口进行适配。
(3)被适配接口(adaptee):被适配者是一个接口或者抽象类,被适配者需要被适配器适配。
(4)客户类(client):直接依赖于目标接口,通过目标接口的引用调用具体目标(或适配器类)的方法,来实现自己所需要的功能。
类适配器和对象适配器的区别
(1)类适配器:类适配器既实现目标接口也实现被适配者接口,在客户类中可以根据需要选择并创建任意一种符合需求的子类来实现具体功能。
(2)对象适配器:对象适配器只实现目标接口,而与被适配者接口直接关联(即含有一个被适配者接口的引用,将被适配者类的方法委托给该引用,即通过该引用来调用被适配者类的方法。)适配器模式的这一点类似于c#中的委托。
适配器模式的定义:
将一个类的接口,转换成客户期望的另一个类的接口,适配器让原来接口不兼容的类可以无间合作。
适配器模式的代码示例——对象适配器
public interface target {
public void tspeak();
}
public interface adapteen { //这是被适配者接口
public String speak(String n);
}
public class adapter implements target{ //适配器,实现目标接口(将被适配者接口适配为目标接口)
adapteen a; //被适配者接口的对象引用,将被适配者类的方法委托与他(即通过a来调用被适配者的方法)
public adapter(adapteen a)
{
this.a=a;
}
public void tspeak()
{
Scanner b=new Scanner(System.in);
String s1=b.next();
String s=a.speak(s1);
s="我现在是"+s+",现在我被适配器适配成了目标类的speak方法了";
System.out.println(s);
}
}
public class shixianadapteen implements adapteen{
public String speak(String n) {
String s=n;
return s;
}
}
public class user1 { //这是client类
String name;
public user1(String name)
{
this.name=name;
}
public void jieshao(target t)
{
System.out.println("我现在是"+name);
t.tspeak();
}
}
public class test {
public static void main(String[] args) {
adapteen a=new shixianadapteen();
Scanner s=new Scanner(System.in);
String s1=s.next();
user1 u1=new user1(s1);
target t=new adapter(a);
u1.jieshao(t);
}
}
关于适配器模式的个人理解:
(1)始终记住一句话:适配器类是目标接口与被适配者之间的桥梁,协调者。
(2)适配器类既实现了目标接口,同时又依赖于被适配者类(含有一个被适配者类的对象引用)
(3)客户类不会直接和被适配者类打交道,可以通过目标接口的引用调用适配器类的方法(接口回调)来间接调用被适配者类(但是注意:其实还是为了将被适配者类适配称自己想要的具体目标)