您的位置:首页 > 其它

设计模式-适配器模式

2014-12-15 22:33 681 查看
适配器模式(Adapter pattern),又叫变压器模式,是将一个类的接口变换成客户端所期待的另一种接口,从而使原本因不匹配而无法一起工作的两个类一起工作。适配器模式有类适配器模式和对象适配器模式两种方式。

适配器模式主要包含以下角色:

目标角色(Target):客户端所期待的角色,通常为抽象类或接口。

源角色(Adaptee): 需要被适配的接口,可以是具体的类、也可以是抽象类或接口。

适配器角色(Adapter):适配器,把源接口转化为目标接口。

下面举一个生活中的例子,以便更好地理解适配器模式。我们生活用电是220V,某小电器的额定电压为22V,此时需要一个变压器。其中:

Target:用户期待22V电源;

Adaptee:当前能提供的220V电源;

Adapter:变压器。

先看类适配器:适配器角色Adapter扩展了Adaptee,同时又实现了目标(Target)接口。



源代码

Target.java (客户端期待的,提供22V电源)

public interface Target {

public int get22V();

}


Adaptee.java (提供220V电源)

public class Adaptee {

public int get220V() {
System.out.println("Adaptee-提供了220V的电源");
return 220;
}

}


Adapter.java (变压器,将220V转换为22V)

public class Adapter extends Adaptee implements Target {

@Override
public int get22V() {
int resource = get220V();
System.out.println("Adapter-将220V转化为22V");
int target = resource / 10;
System.out.println("Adapter-得到22V电源");
return target;
}

}


Client.java (客户端)

public class Client {

public static void main(String[] args) {
Target target = new Adapter();
int value = target.get22V();
System.out.println("Client-使用的电源是:" + value + "V");
}

}


执行结果:

Adaptee-提供了220V的电源
Adapter-将220V转化为22V
Adapter-得到22V电源
Client-使用的电源是:22V


再看对象适配器:对象适配器与类适配器的区别是,adapter不去继承adaptee,而是使用委派关系,依赖adaptee。



源代码:

Target.java

public interface Target {

public int get22V();

}


Adaptee.java

public class Adaptee {

public int get220V() {
System.out.println("Adaptee-提供了220V的电源");
return 220;
}

}


Adapter.java

public class Adapter implements Target {
private Adaptee adaptee;

public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public int get22V() {
int resource = adaptee.get220V();
System.out.println("Adapter-将220V转化为22V");
int target = resource / 10;
System.out.println("Adapter-得到22V电源");
return target;
}

}


Client.java

public class Client {

public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target target = new Adapter(adaptee);
int value = target.get22V();
System.out.println("Client-使用的电源是:" + value + "V");
}

}


执行结果:

Adaptee-提供了220V的电源
Adapter-将220V转化为22V
Adapter-得到22V电源
Client-使用的电源是:22V


总结

建议尽量使用对象适配器模式,少用泛化关系,多用聚合、依赖关系,降低耦合度。适配器模式具有很好的复用性(可以利用现有的、不匹配的接口),适配器还具有很好的扩展性(在适配器中增添自己的逻辑)。但是适配器如果使用太多,那将是灾难性的,不如直接重构。

友情提示:

源码下载地址(GitHub):点此下载本文相关源代码

整个工程为Maven工程,对Maven不熟悉的同学可以查看我的另一篇博客Maven入门
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息