深入浅出适配器模式

简介: 深入浅出适配器模式

深入浅出适配器模式

简介

在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

对象适配器模式

在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。

类适配器模式

这种适配器模式下,适配器继承自已实现的类(一般多重继承)

适配器模式思想:

适配器模式的宗旨:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。

优点:

  • 可以让任何两个没有关联的类一起运行。
  • 提高了类的复用。
  • 增加了类的透明度。
  • 灵活性好。

缺点:

  • 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
  • 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

代码实例

描述:

定义一个插座接口MySocket,方法为doTake(插口类型,使用者名字),对插座类的扩展接口MySuperSocket,有具体的插口功能实现,如TypeA和TypeB的实现,适配器类MySocketAdapter对插座接口进行了实现,并依赖MySuperSocket可以不同的接口进行充电,UseMySocket为直接面向用户的类,依赖适配器类,可以对不同类型的接口进行适配,最高程度的满足用户的需求

类关系图:

代码:

public class Adapter {
    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {
        UseMySocket socket = new UseMySocket();
        socket.doTake("A","张零");
        socket.doTake("B","张一");
        socket.doTake("C","张二");
        socket.doTake("D","张三");
    }
}
/**
 * 插座
 */
interface MySocket {
    /**
     * 默认接口
     */
    void doTake(String type, String name);
}
interface MySuperSocket {
    /**
     * A型接口
     */
    void typeA(String name);
    /**
     * B型接口
     */
    void typeB(String name);
}
/**
 * B型插座类
 */
class TypeBSocketer implements MySuperSocket {
    @Override
    public void typeA(String name) {
         //空实现
         return;
    }
    @Override
    public void typeB(String name) {
        System.out.println(name + " Use TypeB");
    }
}
/**
 * A型插座类
 */
class TypeASocketer implements MySuperSocket {
    @Override
    public void typeA(String name) {
        System.out.println(name + " Use TypeA");
    }
    @Override
    public void typeB(String name) {
        //空实现
        return;
    }
}
/**
 * 适配器类
 */
class MySocketAdapter implements MySocket {
    private MySuperSocket superSocket;
    public MySocketAdapter(String type) {
        if ("A".equals(type)) {
            superSocket = new TypeASocketer();
        } else if ("B".equals(type)) {
            superSocket = new TypeBSocketer();
        }
    }
    @Override
    public void doTake(String type, String name) {
        if ("A".equals(type)) {
            superSocket.typeA(name);
        } else if ("B".equals(type)) {
            superSocket.typeB(name);
        }
    }
}
/**
 * 直接面向用户的类
 */
class UseMySocket implements MySocket {
    private MySocketAdapter mySocketAdapter;
    @Override
    public void doTake(String type, String name) {
        if ("C".equals(type)) {
            System.out.println(name+" Use TypeC");
        } else if ("A".equals(type) || "B".equals(type)) {
            mySocketAdapter = new MySocketAdapter(type);
            mySocketAdapter.doTake(type, name);
        } else {
            System.out.println(name + " Not Find Type To Use");
        }
    }
}

测试结果:

public class Adapter {
    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {
        UseMySocket socket = new UseMySocket();
        socket.doTake("A","张零");
        socket.doTake("B","张一");
        socket.doTake("C","张二");
        socket.doTake("D","张三");
    }
}


相关文章
|
8天前
|
设计模式
深入浅出装饰者模式
深入浅出装饰者模式
18 2
|
8天前
|
设计模式 Java
【设计模式系列笔记】适配器模式
适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一种接口。它允许原本由于接口不匹配而无法一起工作的类能够协同工作。适配器模式通常涉及一个称为适配器的类,它充当两个不兼容接口之间的桥梁。
41 6
|
8天前
|
设计模式
深入浅出组合模式
深入浅出组合模式
13 0
|
10月前
|
设计模式 Java Spring
设计模式笔记 -- 适配器模式
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作,也可以叫做包装器模式
|
6月前
|
设计模式 API 数据库
设计模式系列教程(09) - 适配器模式
设计模式系列教程(09) - 适配器模式
21 0
|
9月前
|
设计模式 开发框架 Java
设计模式简介【Java设计模式】
设计模式简介【Java设计模式】
55 0
|
11月前
|
设计模式 安全 Java
深入浅出设计模式 - 适配器模式
深入浅出设计模式 - 适配器模式
49 0
深入浅出设计模式 - 适配器模式
|
11月前
|
设计模式 安全 Java
深入浅出设计模式 - 装饰者模式
深入浅出设计模式 - 装饰者模式
79 0
深入浅出设计模式 - 装饰者模式
|
11月前
|
设计模式 缓存 安全
深入浅出设计模式 - 外观模式
深入浅出设计模式 - 外观模式
50 0
深入浅出设计模式 - 外观模式
|
11月前
|
设计模式 缓存 安全
深入浅出设计模式 - 代理模式
深入浅出设计模式 - 代理模式
11731 4
深入浅出设计模式 - 代理模式

热门文章

最新文章