一、定义
适配器模式可以将一个类的接口转换成客户期望的另一个接口,适配器让原本不兼容的类可以合作无间。
举一个生活中常见的例子,比如手机上的TypeC接口转3.5mm的二级插口的转换器,就是一个适配器,让不同的物理接口可以正常合作。
在实际的开发中,我们可能遇到系统中期望的接口和第三方提供的接口不一致,这时就可以通过适配器来转化,而不需要更改系统中已有的代码和第三方的代码,就像下图这样:
一、定义
适配器模式可以将一个类的接口转换成客户期望的另一个接口,适配器让原本不兼容的类可以合作无间。
举一个生活中常见的例子,比如手机上的TypeC接口转3.5mm的二级插口的转换器,就是一个适配器,让不同的物理接口可以正常合作。
在实际的开发中,我们可能遇到系统中期望的接口和第三方提供的接口不一致,这时就可以通过适配器来转化,而不需要更改系统中已有的代码和第三方的代码,就像下图这样:
二、实现
下面通过一个简单的例子来实现适配器模式,有一个鸭子接口、一个火鸡接口,现在鸭子的实现类不投用了,我们想用火鸡来冒充鸭子,就可以通过一个适配器来实现
鸭子接口中的叫是quack
方法:
java
public interface Duck {
/**
* 叫
*/
void quack();
}
//一个实现类
public class GaDuck implements Duck{
/**
* 叫
*/
@Override
public void quack() {
System.out.println("嘎嘎叫");
}
}
火鸡接口中的叫是gobble
方法:
java
public interface Turkey {
void gobble();
}
//一个实现类
public class GeTurkey implements Turkey{
@Override
public void gobble() {
System.out.println("咯咯叫");
}
}
要让火鸡来冒充鸭子,适配器需要实现鸭子接口方法,然后在鸭子独有的方法中调用火鸡独有的方法
java
public class TurkeyAdapter implements Duck{
private Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void quack() {
this.turkey.gobble();
}
}
测试:
java
public class Test {
public static void main(String[] args) {
test();
}
static void test(){
Duck gaDuck = new GaDuck();
Turkey geTurkey = new GeTurkey();
Duck turkeyAdapter = new TurkeyAdapter(geTurkey);
System.out.println("嘎嘎鸭叫:");
testDuck(gaDuck);
System.out.println("伪装成鸭子的火鸡叫:");
testDuck(turkeyAdapter);
}
//测试鸭子
static void testDuck(Duck duck){
duck.quack();
}
}
//输出
嘎嘎鸭叫:
嘎嘎叫
伪装成鸭子的火鸡叫:
咯咯叫
可以看到,具体的流程是这样的:
- 客户端
testDuck(Duck duck)
方法调用适配器中Duck
接口的方法 - 适配器接收到请求,将会调用被适配者
Turkey
的方法 - 客户端收到了调用结果,但是并未察觉到适配器的作用
二、实现
下面通过一个简单的例子来实现适配器模式,有一个鸭子接口、一个火鸡接口,现在鸭子的实现类不投用了,我们想用火鸡来冒充鸭子,就可以通过一个适配器来实现
鸭子接口中的叫是quack
方法:
java
public interface Duck {
/**
* 叫
*/
void quack();
}
//一个实现类
public class GaDuck implements Duck{
/**
* 叫
*/
@Override
public void quack() {
System.out.println("嘎嘎叫");
}
}
火鸡接口中的叫是gobble
方法:
java
public interface Turkey {
void gobble();
}
//一个实现类
public class GeTurkey implements Turkey{
@Override
public void gobble() {
System.out.println("咯咯叫");
}
}
要让火鸡来冒充鸭子,适配器需要实现鸭子接口方法,然后在鸭子独有的方法中调用火鸡独有的方法
java
public class TurkeyAdapter implements Duck{
private Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void quack() {
this.turkey.gobble();
}
}
测试:
java
public class Test {
public static void main(String[] args) {
test();
}
static void test(){
Duck gaDuck = new GaDuck();
Turkey geTurkey = new GeTurkey();
Duck turkeyAdapter = new TurkeyAdapter(geTurkey);
System.out.println("嘎嘎鸭叫:");
testDuck(gaDuck);
System.out.println("伪装成鸭子的火鸡叫:");
testDuck(turkeyAdapter);
}
//测试鸭子
static void testDuck(Duck duck){
duck.quack();
}
}
//输出
嘎嘎鸭叫:
嘎嘎叫
伪装成鸭子的火鸡叫:
咯咯叫
可以看到,具体的流程是这样的:
- 客户端
testDuck(Duck duck)
方法调用适配器中Duck
接口的方法 - 适配器接收到请求,将会调用被适配者
Turkey
的方法 - 客户端收到了调用结果,但是并未察觉到适配器的作用