适配器模式
将一个类的接口,转化成客户期望的另一个接口。让原本接口不兼容的类可以合作无间,属于结构型模式。
从结构上分为类适配器、对象适配器和缺省适配器,类适配器,提供一个实现该接口的类,并且扩展已有的类,通过创建
子类来实现适配,对象适配器使用对象引用进行适配。缺省适配器由一个抽象类实现,并且在抽象类中实现所有的方法,具体的子类都要继承此抽象类
如何解决
继承和依赖
关键代码
继承或依赖已有的对象,实现想要的目标接口
优点
- 可以让任何两个没有关联的类一起运行
- 提高了类的复用
- 增加了类的透明度
- 灵活性好
缺点
过多使用适配器会让系统非常凌乱,不易整体进行把握
至多只能适配一个适配器类,而且目标类必须是抽象类
注意
适配器不是在项目初期使用的,而是解决现有代码接口不兼容时出现的
demo
实现一个接口中的部分方法
类适配器实现
package demo1;
/**
* 目标角色
* @author missj
*
*/
public interface Target {
public void write();
public void read();
}
package demo1;
/**
* 源角色
* @author missj
*
*/
public class Old {
public void write() {
System.out.println("write");
}
}
/**
* 适配器
* @author missj
*
*/
package demo1;
public class Adapter extends Old implements Target {
@Override
public void read() {
System.out.println("read");
}
}
/**
* 测试
* @author missj
*
*/
package demo1;
public class Test {
public static void main(String[] args) {
Target t = new Adapter();
t.read();
t.write();
}
}
对象配器实现
package demo2;
/**
* 源角色
* @author missj
*
*/
public class Old {
public void write() {
System.out.println("write");
}
}
package demo2;
/**
* 目标角色
* @author missj
*
*/
public interface Target {
public void write();
public void read();
}
package demo2;
/**
* 适配器
* @author missj
*
*/
public class Adapter implements Target {
private Old old;
public Adapter(Old old) {
this.old = old;
}
public void write() {
this.old.write();
}
public void read() {
System.out.println("read");
}
}
package demo2;
/**
* 测试
* @author missj
*
*/
public class Test {
public static void main(String[] args) {
Old old = new Old();
Target t = new Adapter(old);
t.write();
t.read();
}
}
缺省配器实现
package demo3;
/**
* 目标角色
* @author missj
*
*/
public interface Target {
public void write();
public void read();
}
package demo3;
/**
* 源角色
* @author missj
*
*/
public class Old extends Adapter {
public void write() {
System.out.println("write");
}
}
package demo3;
/**
* 适配器
* @author missj
*
*/
public abstract class Adapter implements Target {
@Override
public void write() {
}
@Override
public void read() {
System.out.println("read");
}
}
package demo3;
/**
* 测试
* @author missj
*
*/
public class Test {
public static void main(String[] args) {
Target t = new Old();
t.write();
t.read();
}
}