1)概述
适配器模式是结构型设计模式之一,其在不修改原来两个模块代码的情况下,将两个不兼容的类融合在一起,有点像粘合剂,通过转换使得他们能够协作起来,
符合了开闭原则.
2)定义
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配无法在一起工作的两个类可以在一起工作.
3)使用场景
- 系统需要使用现有的类,而此类接口不符合系统的需要,即接口不兼容
- 想要建立一个可重复使用的类,用于关联彼此没有太大关联的一些类(包括即将引入的类)
- 需要一个统一的输出接口,而输入端类型不确定.
4)UML
Adapter
模式的结构图如下.
- Target:目标角色,期待得到的接口.
- Adaptee:适配者角色,被适配的接口.
- Adapter:适配器角色,将源接口转换成目标接口.
5)分类
- 类适配器通过继承,是静态的定义方式.
- 而对象适配器通过代理,是动态组合的方式。
6)实现
一.Target,源目标接口:各类水果
package com.zqr.design.adapterPattern;
/**客户想喝果汁
* Target,源目标接口:各类水果
* @ClassName: Target
*/
public interface Target {
//苹果
public void apple();
//香蕉
public void banan();
}
具体的源目标,注:可有可无,没有的时候可以让适配器adapter直接实现Target
package com.zqr.design.adapterPattern;
/**
* 具体的源目标,注:可有可无,没有的时候可以让适配器adapter直接实现Target
* @ClassName: TargetImpl
*/
public class TargetImpl implements Target{
@Override
public void apple() {
System.out.println("拿到苹果.....");
}
@Override
public void banan() {
System.out.println("拿到香蕉.....");
}
}
二.Adaptee,被适配者:各类果汁
package com.zqr.design.adapterPattern;
/**
* Adaptee,被适配者:各类果汁
* @ClassName: Adaptee
*/
public interface Adaptee {
//苹果汁
public void appleJuice();
//香蕉汁
public void bananaJuice();
}
具体的被适配者AdapteeImpl
package com.zqr.design.adapterPattern;
/**
* 具体的被适配者
* @ClassName: ConcreteAdaptee
*/
public class AdapteeImpl implements Adaptee{
@Override
public void appleJuice() {
System.out.println("榨成苹果汁.....");
}
@Override
public void bananaJuice() {
System.out.println("榨成香蕉汁.....");
}
}
三.对象适配器:榨汁机Adapter,可以把水果变成果汁
package com.zqr.design.adapterPattern;
/**
* 榨汁机Adapter:可以把水果变成果汁
* @ClassName: Adapter
*/
public class Adapter extends TargetImpl{//实现或者继承源目标Target
private Adaptee adaptee;//私有,被适配者Adaptee
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void apple() {//重写吃苹果的方法,实际上却喝到了苹果汁
super.apple();
adaptee.appleJuice();
}
@Override
public void banan() {//重写吃香蕉的方法,实际上却喝到了香蕉汁
super.banan();
adaptee.bananaJuice();
}
}
四.客户Client拿到水果Target,想喝果汁Adaptee
package com.zqr.design.adapterPattern;
/**
* 客户Client拿到水果Target,想喝果汁Adaptee
* @ClassName: Client
*/
public class Client {
private Target target;
public Client(Target target) {
this.target = target;
}
public void drinkAppleJuice() {
target.apple();
}
public void drinkBananasJuice() {
target.banan();
}
五.测试
Pass:
类适配器AdapterClass,实现源目标接口,继承被适配者
package com.zqr.design.adapterPattern;
/**
* 类适配器:实现源目标接口,继承被适配者
* @ClassName: AdapterClass
*/
public class AdapterClass extends AdapteeImpl implements Target{
@Override
public void apple() {
super.appleJuice();//调用源目标的apple()方法,实际执行的是被适配者的appleJuice()方法
}
@Override
public void banan() {
super.bananaJuice();//调用源目标的banan()方法,实际执行的是被适配者的bananaJuice()方法
}
}