写点什么

【设计模式】第九篇 - 适配器模式 - 你多大鞋,我多大脚

用户头像
Brave
关注
发布于: 4 小时前

一,前言


随着上一篇原型模式的完成,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 的匹配程度;


使用场景:

  • 使用一个已经存在的类,但接口不符合现有需求时;

  • 创建一个可以被复用的类,使该类能够与其他无关的类甚至还没有创建的类协同工作;

  • 使用一个已经存在的子类,但不可能对所有的子类进行接口匹配时,使用对象适配器对其父类接口进行匹配;


适配器模式,能够在不改变原有代码的情况下,使原本不兼容的接口可以一起工作,符合满足开放-封闭原则;


用户头像

Brave

关注

还未添加个人签名 2018.12.13 加入

还未添加个人简介

评论

发布
暂无评论
【设计模式】第九篇 - 适配器模式 - 你多大鞋,我多大脚