一,前言
随着上一篇原型模式的完成,6种创建型设计模式我们都说了一遍
创建型模式包含:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式
后面将开始介绍7中结构型设计模式:(其中组合模式在开篇说过了)
桥接模式,适配器模式,装饰模式,组合模式,享元模式,外观模式,代理模式
这篇我们来说适配器模式
实际项目中,经常会遇到以前的模块接口和当前设计的模块接口不吻合以至于无法复用的情况
在项目模块中引入第三方组件时也时长会有类似问题出现
适配器模式就是将一个类的接口转换成另一个接口的模式
能在不改变原有代码的情况下,使原本不兼容的接口可以一起工作
二,适配器模式
适配器模式:将一个类的接口转换成客户希望的另外一个接口
适配器模式又分类适配器和对象适配器
类适配器:通过继承方式实现,依赖较大,会造成继承膨胀
对象适配器:通过对象组合方式,更灵活
基于适配器模式的定义和特点,我们选用一个例子来进行说明
鞋子和脚的关系是一定要合适的
我们将鞋子看做是目标类
脚看做是被适配类
由于目标类的不确定性,我们就将脚适配为鞋子需要的大小
虽然这个例子有些牵强,实际情况我们都是根据脚的大小来买鞋子
但不是有句话这么说:你有多大鞋,我就多大脚
三,适配器模式例子
适配器模式包含:被适配角色 适配器角色 目标角色
我们将39号和41号的脚适配为40号的脚,并由40的鞋子调用穿鞋方法
1,被适配者接口Adaptee
package com.brave.adapter.foot;
/**
* 被适配者接口
* @author Brave
*
*/
public interface Adaptee {
// 展示原始信息
void putOnShoes();
}
2,实现被适配者接口的39号脚和41号脚
package com.brave.adapter.foot;
/**
* 39号脚
* @author Brave
*
*/
public class Foot39 implements Adaptee{
@Override
public void putOnShoes(){
System.out.println("脚:其实我是39号脚!");
}
}
package com.brave.adapter.foot;
/**
* 39号脚
* @author Brave
*
*/
public class Foot41 implements Adaptee{
@Override
public void putOnShoes(){
System.out.println("脚:其实我是41号脚!");
}
}
3,适配器接口:用来将39和41号脚适配成40号鞋子需要的脚
package com.brave.adapter.foot;
/**
* 适配器接口
* @author Brave
*
*/
public interface Adapter {
// 穿鞋40号鞋的方法
void putOnShoes40();
}
4,实现适配器接口的40号脚适配器:将任何被适配者适配成40号鞋子需要的脚
package com.brave.adapter.foot;
// 适配为40号
public class Adapter40 implements Adapter {
private Adaptee adaptee;
public Adapter40(Adaptee adaptee) {
System.out.println("适配器:给我你的脚,不管你多大脚,我都将你适配为40号!");
this.adaptee = adaptee;
System.out.println("脚:脚已经给你了,你看着办吧");
}
@Override
public void putOnShoes40() {
System.out.println("适配器:来试试40号的鞋子吧");
adaptee.putOnShoes();
}
}
5,40号鞋子类:只能调用符合40号脚特征的脚
package com.brave.adapter.foot;
/**
* 40号的鞋子
* @author Brave
*
*/
public class Shoes40 {
private Adapter adapter;
public Shoes40(Adapter adapter) {
this.adapter = adapter;
}
private void putOn(){
adapter.putOnShoes40();
}
}
6,测试类
package com.brave.adapter.foot;
public class Client {
public static void main(String[] args) {
Adaptee foot = new Foot39();
Adapter adapter = new Adapter40(foot);
adapter.putOnShoes40();
System.out.println("---------------------");
foot = new Foot41();
adapter = new Adapter40(foot);
adapter.putOnShoes40();
}
}
测试输出:
适配器:给我你的脚,不管你多大脚,我都将你适配为40号!
脚:脚已经给你了,你看着办吧
适配器:来试试40号的鞋子吧
脚:其实我是39号脚!
---------------------
适配器:给我你的脚,不管你多大脚,我都将你适配为40号!
脚:脚已经给你了,你看着办吧
适配器:来试试40号的鞋子吧
脚:其实我是41号脚!
四,适配器模式总结
虽然与客户端直接通信的是适配器,但真正进行工作的实体确是被适配的类
对于适配器,工作量取决于被适配对象Adaptee和目标接口Target的匹配程度
使用场景:
使用一个已经存在的类,但接口不符合现有需求时
创建一个可以被复用的类,使该类能够与其他无关的类甚至还没有创建的类协同工作
使用一个已经存在的子类,但不可能对所有的子类进行接口匹配时,使用对象适配器对其父类接口进行匹配
能在不改变原有代码的情况下,使原本不兼容的接口可以一起工作,符合满足开放-封闭原则