发布时间:2025-12-09 11:57:42 浏览次数:2
定义:适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。
属于结构型模式
主要分为三类:类适配器模式、对象的适配器模式、接口的适配器模式。
本文定义:
需要被适配的类、接口、对象(我们有的),简称 src(source) 最终需要的输出(我们想要的),简称 dst (destination,即Target) 适配器称之为 Adapter 。
一句话描述适配器模式的感觉: src->Adapter->dst,即src以某种形式(三种形式分别对应三种适配器模式)给到Adapter里,最终转化成了dst。
1 系统需要使用现有的类,而这些类的接口不符合系统的需要。 2 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。 3 需要一个统一的输出接口,而输入端的类型不可预知。
一句话描述:Adapter类,通过继承 src类,实现 dst 类接口,完成src->dst的适配。 我们通过一个最常用的例子来说明 生活中最常见的就是充电器,220V的交流电被转换成5V的直流电,充电器在其中就担当了适配器的功能
既然我们是进行适配,那就说明是基于某一个功能点的实现,所以我们先定义一个输出220v交流电的功能,这个功能如下
/// <summary> /// 220V电压 /// </summary> public class Voltage220 { public int output220v() { int src = 220; Console.WriteLine("我是" + src + "伏电压"); return src; } } 定义一个接口,接口的方法签名是转换(220V-5V)
/// <summary> /// 客户需要的5V电压接口 /// </summary> public interface Voltage5 { /// <summary> /// 输出5V /// </summary> /// <returns></returns> int output5v(); }接下去我们开始定义适配器类 !!!注意点 1、继承后来的类 2、实现适配器接口
/// <summary> /// 类适配器 /// </summary> public class VoltageAdapter : Voltage220, Voltage5 { public int output5v() { int src = new Voltage220().output220v(); Console.WriteLine("适配器工作开始适配电压"); int dst = src / 44; Console.WriteLine("适配完成后输出电压:" + dst); return dst; } }此时我们需要一个设备,使用适配器查看功能是否正确 定义一个手机类,实现转换功能 Mobile.charging(适配器 box1) 实例化手机,调用充电方法,形参是适配器的实例
/// <summary> /// 手机类 /// </summary> public class Mobile { /// <summary> /// 充电方法 /// </summary> /// <param name="voltage5"></param> public void charging(Voltage5 voltage5) { if (voltage5.output5v() == 5) { Console.WriteLine("电压刚刚好5V,开始充电"); } else if (voltage5.output5v() > 5) { Console.WriteLine("电压超过5V,都闪开 我要变成note7了"); } } }功能实现
/// <summary> /// 类适配器 /// </summary> public static void ClassStart() { Console.WriteLine("===============类适配器=============="); Mobile mobile = new Mobile(); mobile.charging(new VoltageAdapter()); }基本思路和类的适配器模式相同,只是将Adapter类作修改,这次不继承src类,而是持有src类的实例,以解决兼容性的问题。 即:持有 src类,实现 dst 类接口,完成src->dst的适配。 (根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系,因此大部分结构型模式都是对象结构型模式。)
/// <summary> /// 对象适配器 /// </summary> public class VoltageAdapter2 : Voltage5 { private Voltage220 voltage220; public VoltageAdapter2(Voltage220 voltage220) { this.voltage220 = voltage220; } public int output5v() { int dst = 0; if (null != voltage220) { int src = voltage220.output220v(); Console.WriteLine("对象适配器工作,开始适配电压"); dst = src / 44; Console.WriteLine("适配完成后输出电压:" + dst); } return dst; } }功能实现
/// <summary> /// 对象适配器 /// </summary> public static void ObjectStart() { Console.WriteLine("===============对象适配器=============="); VoltageAdapter2 voltageAdapter2=new VoltageAdapter2(new Voltage220()); Mobile mobile = new Mobile(); mobile.charging(voltageAdapter2); }对象适配器和类适配器其实算是同一种思想,只不过实现方式不同。 根据合成复用原则,组合大于继承, 所以它解决了类适配器必须继承src的局限性问题,也不再强求dst必须是接口。 同样的它使用成本更低,更灵活