1、简介
将一个类的接口转成客户期望的另外一个接口。适配器模式使得原本由于接口不匹配而不能一起工作的那些类可以一起工作。
使用场景想必大家已经清楚了,它主要就是用于将一个原有的接口转换为满足我们实际需要的接口。
2、具体实现
适配模式在代码中分为三种,类的适配器模式,对象的适配器模式,接口的适配器模式
(1)类的适配器模式
class Duck{
public void action(){
System.out.println("我在陆地上行走");
}
}
//定义一个能飞的接口
interface Fly{
public void fly();
}
//现在我想要鸭子能飞,使用继承定义一个FlyDuck适配
class FlyDuck extends Duck implements Fly{
@Override
public void fly() {
action();
System.out.println("现在我能飞了");
}
}
(2)对象的适配器模式,这种方式主要通过组合来实现,大家应该很熟悉。
class Duck{
public void action(){
System.out.println("我只能在陆地上行走");
}
}
//定义一个能飞的接口
interface Fly{
public void fly();
}
//使用组合的方式
class FlyDuck implements Fly{
private Duck duck;
public FlyDuck(Duck duck){
this.duck = duck;
}
@Override
public void fly() {
duck.action();
System.out.println("现在我能飞了");
}
}
(3)接口的适配器模式,借助抽象类来实现适配器功能。
//定义一个接口
interface Fly{
public void fly();
public void run();
public void swim();
}
//定义一个抽象类实现接口
abstract class Duck implements Fly{
public void fly(){}
public void run(){}
public void swim(){}
}
//中间加一个抽象类的目的就是可以不实现接口中的所有方法,可以进行选择。
class FlyDuck extends Duck{
public void fly(){
System.out.println("我能飞了");
}
public void run(){
System.out.println("我正在跑");
}
public void swim(){
System.out.println("我能游泳了");
}
}
//定义适配器 这种方式比较灵活一点,可以在适配器内部进行选择
public class Adpater {
public static void main(String[] args) {
FlyDuck duck = new FlyDuck();
duck.run();
duck.fly();
//duck.swim();
}
}
3、总结
Java的适配器模式有三种,这里再说一下它们各自的使用场景
(1)当希望将一个类转换为满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。
(2) 当希望将一个对象转换成满足另一个新接口的对象时,使用对象适配的方法,可以创建一个新的类,持有原类的一个实例,在新类的方法中,调用实例的方法就行。
(3)当不希望实现一个接口中所有的方法时,可以创建一个抽象类,实现所有方法,我们写别的类的时候,继承抽象类即可,例如接口的适配器模式。
个人小结
以前写代码总是从别处学到的,认为写那种web项目就应该是dao,service,controller三层结构(这里只拿这种简单的例子来说),但是今天看完适配器模式时,可以想到这种代码结构也是符合适配器模式的,service接口层就是目标角色,dao层就是源角色,而在sevices接口实现层中,也就是各种impl中,我们调用dao的类,把从dao的类再经过变换,得到我们想要的结果,这不就正好符合适配的思想吗,我们没法直接从原接口中得到想要的结果,只好把原接口经过适配,转换成我们想要的结果,并返回。这只是我个人的观点,如果有不合适的话,请大家指正。