学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。
适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。
- 客户端通过适配器可以透明地调用目标接口。
- 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
- 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
- 在很多业务场景中符合开闭原则。
- 适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性。
- 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。
对象适配器模式可釆用将现有组件库中已经实现的组件引入适配器类中,该类同时实现当前系统的业务接口。现在来介绍它们的基本结构。
适配器模式(Adapter)包含以下主要角色。
- 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
- 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
- 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
类适配器模式的结构图如图 1 所示。类适配器有很多的局限性,所以一般不推荐使用。
图1
对象适配器模式的结构图如图 2 所示。对象适配器,满足里氏替换原则,推荐使用。
图2using DesignPattern.AdapterPattern;
using System;
namespace DesignPattern
{
internal class Program
{
static void Main(string[] args)
{
AdapterHelper();
}
#region Pattern - Adapter
static void AdapterHelper()
{
#region 类适配器, 会发现和网线没有任何关系。用的计较少
Reticle reticle1 = new Reticle();
Computer computer1 = new Computer();
Adapter1 adapter1 = new Adapter1();
computer1.Net(adapter1);
#endregion
#region 对象适配器, 比较常用
Computer computer2 = new Computer();
Reticle reticle2 = new Reticle();
Adapter2 adapter2 = new Adapter2(reticle2); //适配器链接网线
computer2.Net(adapter2); //电脑通过适配器使用网线上网
#endregion
Console.ReadLine();
}
#endregion
}
}
//======================================================================================
using System;
namespace DesignPattern.AdapterPattern
{
///
/// 用USB上网接口
///
public interface INetToUsb
{
void HandleRequest();
}
//类适配器
public class Adapter1 : Reticle, INetToUsb
{
public void HandleRequest()
{
base.Request();
Console.WriteLine("已经可以上网了1111111");
}
}
//对象适配器
public class Adapter2 : INetToUsb
{
private Reticle reticle;
public Adapter2(Reticle reticle)
{
this.reticle = reticle;
}
public void HandleRequest()
{
reticle.Request();
Console.WriteLine("已经可以上网了2222222");
}
}
///
/// 电脑
///
public class Computer
{
///
/// 上网
///
/// USB适配器
public void Net(INetToUsb adapter)
{
adapter.HandleRequest();
}
}
///
/// 网线
///
public class Reticle
{
public void Request()
{
Console.WriteLine("用网线上网");
}
}
}
运行内容
小黑的今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加小黑的QQ:841298494,大家一起进步。
- 小黑的杂货铺,想要什么都有,客官不进来喝杯茶么?
- 小黑总结的GoF23 种设计模式的分类和功能