适配器模式,将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器有对象适配器和类适配器之分,区别之处在于是通过组合完成还是通过继承完成。下面主要讨论对象适配器。
组成:
目标(Target)角色:定义客户使用的接口。
被适配(Adaptee)角色:已经存在的接口,需要我们适配。
适配(Adapter)角色:将已有的接口转换成目标角色希望的接口。
类图关系:
具体实例:
假设已经存在一个Shape接口,已经定义了显示自己display()和移除自己remove()方法;现在想实现圆(circle)的显示自己和移除自己,系统中已经有现成的代码(TextCircle),但是方法命名有点不同。现在就通过适配器来转换这个接口。
Shape接口:
public interface Shape {
public abstract void display();
public abstract void remove();
}
Point类:
public class Point implements Shape {
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("point display...");
}
@Override
public void remove() {
// TODO Auto-generated method stub
System.out.println("remove point...");
}
}
TextCircle类(Adaptee):
public class TextCircle {
public void displayIt() {
System.out.println("circle display...");
}
public void removeIt() {
System.out.println("remove circle...");
}
}
Circle类(Adapter):
public class Circle implements Shape {
private TextCircle textCircle;
public Circle() {
textCircle = new TextCircle();
}
@Override
public void display() {
// TODO Auto-generated method stub
textCircle.displayIt();
}
@Override
public void remove() {
// TODO Auto-generated method stub
textCircle.removeIt();
}
}
客户端:Client.java
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Shape circle = new Circle();
circle.display();
circle.remove();
}
}
运行结果:
适配角色通过组合被适配的对象,然后再调用已经存在的方法,来达到适配的效果。
应用场景:
1、想使用一个已经存在的类,但是它的接口不符合你的需求。
2、想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作。