结构性模式 - 适配器模式Adapter

学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。

 

模式的定义与特点

        适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。  

1.适配器模式的优点

  • 客户端通过适配器可以透明地调用目标接口。
  • 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
  • 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
  • 在很多业务场景中符合开闭原则。

2.适配器模式的缺点

  • 适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性。
  • 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。

模式的结构与实现

对象适配器模式可釆用将现有组件库中已经实现的组件引入适配器类中,该类同时实现当前系统的业务接口。现在来介绍它们的基本结构。  

1. 模式的结构

适配器模式(Adapter)包含以下主要角色。

  1. 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  2. 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  3. 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

类适配器模式的结构图如图 1 所示。类适配器有很多的局限性,所以一般不推荐使用。

图1

 

 对象适配器模式的结构图如图 2 所示。对象适配器,满足里氏替换原则推荐使用

图2
using 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
{
    /// <summary>
    /// 用USB上网接口
    /// </summary>
    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");
        }
    }

    /// <summary>
    /// 电脑
    /// </summary>
    public class Computer
    {
        /// <summary>
        /// 上网
        /// </summary>
        /// <param name="adapter">USB适配器</param>
        public void Net(INetToUsb adapter)
        {
            adapter.HandleRequest();
        }
    }

    /// <summary>
    /// 网线
    /// </summary>
    public class Reticle
    {
        public void Request()
        {
            Console.WriteLine("用网线上网");
        }
    }
}
运行内容


希望大家:点赞,留言,关注咯~    
😘😘😘😘

唠家常

小黑的今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加小黑的QQ:841298494,大家一起进步。

  • 客官,看完get之后记得点赞哟!
  • 小伙伴你还想要别的知识?好的呀,分享给你们😄

今日推荐

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青衫磊落长歌行

觉得小黑这篇文章不赖,打赏哟~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值