简介
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
适配器模式有三种:类适配器、对象适配器、接口适配器
前二者在实现上有些许区别,作用一样,第三个接口适配器差别较大。
场景
- 用来做旧系统改造和升级
- 如果一个接口中定义的抽象方法过多,而子类中很多抽象方法又不需要用到,就应该设计一个适配器。
模式中的角色
- 目标接口(Target)
客户所期待的接口。目标接口时具体的或抽象的类,也可以是接口。 - 需要是适配的类(Adaptee)
需要适配的类或适配者类。 - 适配器(Adapter)
通过包装一个需要适配的对象,把原接口转换成目标接口。
类适配器、对象适配器
UML
- 客户端:
package com.amberweather.adapter;
/**
*
* 客户端类,笔记本电脑
* 插键盘需要usb接口
* @author HT
*
*/
public class Client {
//客户端需要传入usb接口
public void test1(Target t){
t.handleRequest();
}
public static void main(String[] args) {
Client c = new Client();
Adaptee a = new Adaptee();
Target t = new Adapter();
c.test1(t);
}
}
- 客户端当前需要的接口:
package com.amberweather.adapter;
/**
* 表示客户端用到的当前的接口
* usb接口
* @author HT
*
*/
public interface Target {
void handleRequest();
}
- 需要调用,但接口不支持的类:
package com.amberweather.adapter;
/**
*
* 被适配的对象
* 例如键盘
* @author HT
*
*/
public class Adaptee {
public void request(){
System.out.println("我是一个键盘,但我是圆心插孔");
}
}
- 适配器(通过继承实现):
package com.amberweather.adapter;
/**
* 类适配器方式
* 适配器
* 接口之间的转换
* @author Administrator
*
*/
public class Adapter extends Adaptee implements Target {
@Override
public void handleRequest() {
super.request();
}
}
- 适配器(通过组合实现):
package com.amberweather.adapter;
/**
* 使用组合的方式实现适配器
*
* @author Administrator
*
*/
public class Adapter2 implements Target {
Adaptee a ;
@Override
public void handleRequest() {
a.request();
}
public Adapter2(Adaptee a) {
super();
this.a = a;
}
}
接口适配器
public interface A {
void a();
void b();
void c();
void d();
void e();
void f();
}
public abstract class Adapter implements A {
public void a(){}
public void b(){}
public void c(){}
public void d(){}
public void e(){}
public void f(){}
}
public class Ashili extends Adapter {
public void a(){
System.out.println("实现A方法被调用");
}
public void d(){
System.out.println("实现d方法被调用");
}
}
public class Client {
public static void main(String[] args) {
A a = new Ashili();
a.a();
a.d();
}
}