Java适配器模式——类适配器模式
类适配器模式UML图示:
public interface target { //目标接口
public void tspeak();
}
public interface adaptee { //被适配者类
public void aspeak();
}
public class adapter implements target,adaptee{ //适配器类,实现两个接口(被适配者接口和目标接口),当用户需要目标接口的方法时可以调用tspeak方法,当用户需要
//被适配者类的方法时,可以调用aspeak方法
public void tspeak() {
System.out.println("这是目标接口的speak方法");
}
public void aspeak() {
System.out.println("这是被适配者模式的speak方法");
}
}
public class user1 { //client类
String name;
public user1(String name)
{
this.name=name;
}
public void jieshao(adaptee a) //传递进来一个被适配者类的引用,在main函数中将用到接口回调思想(即传递进来一个适配器类的引用,通过该引用调用适配器类中实现的方法)
{
a.aspeak(); //根据用户需要调用相应的方法
System.out.println(name+"我用的是被适配者");
}
}
public class user2 { //这是client类,可以通过其中的方法来调用被适配者或者目标接口的方法
String name;
public user2(String name)
{
this.name=name;
}
public void jieshao(target t)
{ t.tspeak();
System.out.println(name+"我用的是目标接口");
}
}
public class test {
public static void main(String[] args) {
adaptee a=new adapter(); //声明一个adaptee接口的引用,并为它赋予adapter对象(接口回调),使得a可以调用adapter的重写adaptee的方法
user1 u1=new user1("张三");
u1.jieshao(a);
target t=new adapter(); //声明一个target接口的引用,并为它赋予target对象(接口回调),使得t可以调用adapter的重写的tatget的方法
user2 u2=new user2("李四");
u2.jieshao(t);
}
}
关于适配器模式的个人总结:
(1)适配器模式的关键在于适配器(可以说适配器是被适配者类和目标接口之间的一个桥梁,通过适配器将被适配者的一些方法转换为用户希望的目标接口的方法)
(2)对于对象适配器,由于适配器类与被适配器类之间是直接关联的关系,所以适配器类中必须有一个被适配者类的引用,通过该引用调用被适配者方法,将其修改为用户希望使用的方法。
(3)适配器模式很好地体现了面向对象编程思想的开闭原则(对扩展开放,对修改关闭)。为什么会出现适配器类,是因为当前被适配者类提供的方法不能满足一些客户的需求,但是又不想对该适配这类进行修改(因为对修改关闭)。所以就出现了目标接口(含有一些用户想要实现的相似得功能方法),但是用户不能直接使用该目标接口,所以诞生了适配器类。