适配器模式(Adapter):将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。
主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。
##一、类的适配器模式
### 1、uml建模:
![](https://box.kancloud.cn/2016-02-19_56c7196d8e237.jpg)
### 2、代码实现
~~~
/**
* 示例(一):类的适配器模式
*
* 原类拥有一个待适配的方法originMethod
*/
class Original {
public void originMethod() {
System.out.println("this is a original method...");
}
}
interface Targetable {
/**
* 与原类的方法相同
*/
public void originMethod();
/**
* 目标类的方法
*/
public void targetMethod();
}
/**
* 该Adapter类的目的:将Original类适配到Targetable接口上
*/
class Adapter extends Original implements Targetable {
/**
* 可以看到该类只需要实现targetMethod即可。
*
* 因为Targetable接口里的originMethod方法已经由Original实现了。
*
* 这就是Adapter适配器这个类的好处:方法实现的转移(或称嫁接) --> 将Adapter的责任转移到Original身上
*
* 这样就实现了类适配器模式 --> 将Original类适配到Targetable接口上
*
* 如果Original又添加了一个新的方法originMethod2,那么只需在Targetable接口中声明即可。
*/
@Override
public void targetMethod() {
System.out.println("this is a target method...");
}
}
/**
* 客户端测试类
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
Targetable target = new Adapter();
target.originMethod();
target.targetMethod();
}
}
~~~
##二、对象的适配器模式
### 1、uml建模:
![](https://box.kancloud.cn/2016-02-19_56c7196d9d100.jpg)
### 2、代码实现:
~~~
/**
* 示例(二):对象的适配器模式
*
* 原类拥有一个待适配的方法originMethod
*/
class Original {
public void originMethod() {
System.out.println("this is a original method...");
}
}
interface Targetable {
/**
* 与原类的方法相同
*/
public void originMethod();
/**
* 目标类的方法
*/
public void targetMethod();
}
/**
* 持有Original类的实例
*/
class Adapter implements Targetable {
private Original original;
public Adapter(Original original) {
this.original = original;
}
@Override
public void targetMethod() {
System.out.println("this is a target method...");
}
@Override
public void originMethod() {
original.originMethod();
}
}
/**
* 客户端测试类
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
Original original = new Original();
Targetable target = new Adapter(original);
target.originMethod();
target.targetMethod();
}
}
~~~
##三、接口的适配器模式
### 1、uml建模:
![](https://box.kancloud.cn/2016-02-19_56c7196daaab2.jpg)
### 2、代码实现
~~~
/**
* 示例(三):接口的适配器模式
*
* 这次咱们直接将原类做成一个接口 --> 原始接口
*/
interface Originable {
public void originMethod1();
public void originMethod2();
}
/**
* 该抽象类实现了原始接口,实现了所有的方法。
*
* 空实现即可,具体实现靠子类,子类只需实现自身需要的方法即可。
*
* 以后咱们就不用跟原始的接口打交道,只和该抽象类取得联系即可。
*/
abstract class Adapter implements Originable {
public void originMethod1() {
}
public void originMethod2() {
}
}
/**
* 子类只需选择你所需要的方法进行实现即可
*/
class OriginSub1 extends Adapter {
@Override
public void originMethod1() {
System.out.println("this is Originable interface's first sub1...");
}
/**
* 此时:originMethod2方法默认空实现
*/
}
class OriginSub2 extends Adapter {
/**
* 此时:originMethod1方法默认空实现
*/
@Override
public void originMethod2() {
System.out.println("this is Originable interface's second sub2...");
}
}
/**
* 客户端测试类
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
Originable origin1 = new OriginSub1();
Originable origin2 = new OriginSub2();
origin1.originMethod1();
origin1.originMethod2();
origin2.originMethod1();
origin2.originMethod2();
}
}
~~~
##四、总结
1、类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。
2、对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Adapter类,持有原类的一个实例,在Adapter类的方法中,调用实例的方法就行。
3、接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Adapter实现所有方法,我们写别的类的时候,继承抽象类即可。
- 前言
- (一)策略模式建模与实现
- (二)观察者模式建模与实现
- (三)装饰者模式建模与实现
- (四)工厂方法模式建模与实现
- (五)抽象工厂模式建模与实现
- (六)单例模式建模与实现
- (七)命令模式建模与实现
- (八)适配器模式建模与实现
- (九)外观模式建模与实现
- (十)模板方法模式建模与实现
- (十一)迭代器模式建模与实现
- (十二)组合模式建模与实现
- (十三)状态模式建模与实现
- (十四)代理模式建模与实现
- (十五)建造者模式建模与实现
- (十六)原型模式建模与实现
- (十七)桥接模式建模与实现
- (十八)责任链模式建模与实现
- (十九)备忘录模式建模与实现
- (二十)解释器模式建模与实现
- (二十一)享元模式建模与实现
- (二十二)中介者模式建模与实现
- (二十三)访问者模式建模与实现
- Java设计模式博客全目录