适配器设计模式
适配器模式在生活中还是很常见的,比如笔记本上的电源适配器,可以使用110~220V之间变化的电源,笔记本还能正常工作。适配器模式就是把一个接口或类转换成其他接口或类,也可以说适配器模式也就是一个包装模式。
适配器模式三个角色:
(1)Target 目标角色:我们期待的接口
(2)Adaptee源角色:源角色转换为目标角色
(3)Adapter适配器角色
代码Demo:
目标接口:
//Target.java
public interface Target {
public void request();}
//ConcreteTarget.java
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("now, service for you !");
}
}
Adapetee源角色:
//Adapetee.java
public class Adaptee {
public void dosomething() {
System.out.println("I`m doing something");
}
}
Adapeter适配器:
//Adapter.java
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.dosomething();
}
}
客户端:
//Client.java
public class Client {
public static void main(String[] args) {
Target target = new ConcreteTarget();
target.request();
Target newTarget = new Adapter();
newTarget.request();
}
}
适配器模式使用场景:你有动机修改一个已经投产中的接口时,适配器模式可能是最适合的模式。
适配器模式的扩展:如果源角色Adaptee不止一个呢?这是时候的适配器又该如何写呢?
在上述Demo里面添加第二个源角色Adapetee2
//Adaptee2.java
public class Adaptee2 {
public void say(){
System.out.println("hello");
}
}
这时候就不能再使用上面的方法了,java是不支持多继承的,无法让Adapter同时继承Adaptee和Adaptee2,此路不通,我们可以使用类关联的方法。我们这样写适配器Adapter和client:
//Adapter.java
public class Adapter implements Target {
private Adaptee a1 = null;
private Adaptee2 a2 = null;
public Adapter(Adaptee a1, Adaptee2 a2) {
this.a1 = a1;
this.a2 = a2;
}
@Override
public void request() {
a1.dosomething();
a2.say();
}
}
//Client.java
public class Client {
public static void main(String[] args) {
Adaptee a1 = new Adaptee();
Adaptee2 a2 = new Adaptee2();
Target target = new ConcreteTarget();
target.request();
Target newTarget = new Adapter(a1,a2);
newTarget.request();
}
}
巧妙的利用构造方法把原有的继承关系变成了关联关系,上面的方法叫类适配器,而这种叫对象适配器,下面是对象适配器的类图。