java中适配器设计模式(adapter)
1、 适用范围
在准备实现某个指定接口的时候,我们可能会发现存的类已经提供了这种功能,只是方法名不同而已。这个时候,我们可以通过利用适配器模式类癌这个现存的类与外界交互的接口,从而满足用户的要求。适配器模式的宗旨就是,保留现有的类提供的服务,修改器接口,从而达到客户的期望。适配器模式是用来解决使用不兼容的接口的问题的方案。
2、 举例
当我们打算改动代码以适配客户需求的时候,可能会发现客户大骂已经为这种情况做好了安排。如果客户开发人员提供了Java接口,并定义了其所期望的功能,这个时候该怎么做就很清楚了。如下图:客户代码包中的类调用了Java接口中声明的service()方法。假定我们可以找到一个现存的类拥有能够提供客户所期望功能的的方法,不过该方法名为usefulMethod()。这样,我们就可以写一个新类,让它扩展现存类ExistingClass,实现ThoughtfulInterface接口,并重载其中的service()方法。新类的service()就可以将调用请求委托给usefulMethod()方法处理,这样就能达到利用现有代码以满足客户需求的目的。
3、 类适配器和对象适配器
上面举得例子是类适配器模式,即通过创建现存类的子类达到适配的目的。但是在其他情况下,我们可能无法继承这个现存类,这时,我们需要创建一个适配器以适应多个对象,甚至有时候,适配的目标牧师Java接口,而是抽象类。在这种情况下,该适配器使用委托方式而不是继承方式,即在类中定义现存类的实例。Java中的JTable就是一个很好的实例。
这两种适配器的主要区别是:
1) 类适配器模式需要创建自身来创建一个Adaptee,
对象适配器模式可以直接使用一个已有的Adaptee的实例来转换接口。
2) 类适配器继承了Adaptee,所以可以通过覆写来扩展SpecificRequest()
对象适配器和Adaptee是包含关系不能直接扩展;
3) 类适配器模式因为是继承所以相对静态,而对象适配器模式是包含是组合相对灵活(可以通过写adaptee子类扩展功能)
由于继承增加了模块间的耦合程度,而组合降低了耦合程度,所以在项目开发中往往建议多使用对象适配器模式。
4、 其他
只有调用方通过Java接口限定了适配器类应该具有的功能,适配器类才是比较健壮的
实例:
适配器设计模式
package org.leadfar;
}
package org.leadfar;
public class Circle extends Shape {
@Override
public void display() {
System.out.println("画一个圆");
}
}
package org.leadfar;
public class Line extends Shape {
@Override
public void display() {
System.out.println("画一根线");
}
}
package org.leadfar;
public class Polygon {
public void paint() {
System.out.println("画一个多边形");
}
}
package org.leadfar;
public class MyPolygon extends Shape {
private Polygon p;
public MyPolygon(Polygon p){
this.p=p;
}
@Override
public void display() {
p.paint();
}
}
package org.leadfar;
import java.util.ArrayList;
import java.util.List;
public class GraphicsPrograme {
private List<Shape> shapes=new ArrayList<Shape>();
public void addShape(Shape s){
shapes.add(s);
}
public void draw(){
for(Shape s:shapes){
s.display();
}
}
public static void main(String[] args) {
GraphicsPrograme gp=new GraphicsPrograme();
gp.addShape(new Circle());
gp.addShape(new Circle());
gp.addShape(new Line());
gp.addShape(new MyPolygon(new Polygon()));
gp.draw();
}
}