zoukankan      html  css  js  c++  java
  • C#设计模式(7)——适配器模式

    出处:https://www.cnblogs.com/wyy1234/

    阅读目录


    1.适配器模式介绍

      适配器模式的作用是将一个类的接口,转换成客户端希望的另外一种接口,适配器作为原始接口(我们的类中本来具有的功能)和目标接口(客户端希望的功能)之间的桥梁。举个例子:我们知道安卓数据线是不能给苹果手机充电的,但是我们没有苹果数据线,所以只能使用安卓数据线给苹果手机充电,这时怎么解决呢?通过一个转换头就可以了,这个转换头就是一个适配器。在适配器模式中:安卓数据线是我们现有的类,充电是安卓数据线的功能,但是充电功能就是因为接口不兼容所以不适应新环境(给苹果手机充电),转换头作为苹果手机和安卓数据线之间的桥梁,让原有的充电功能使用于新环境(给苹果手机充电)。

    适配器模式有两种类型:类适配器和对象适配器,类适配器通过多重继承实现接口的匹配,C#不支持多重继承,我们不考虑。我们主要介绍对象适配器。首先说明介绍适配器模式的三个角色:

      Adaptee:初始角色,实现了我们想要使用的功能,但是接口不匹配

      Target:目标角色,定义了客户端期望的接口

      Adapter:适配器角色,实现了目标接口。实现目标接口的方法是:内部包含一个Adaptee的对象,通过这个对象调用Adaptee的原有方法实现目标接口。(注:这里说的是对象适配器)

    下边我们就以安卓数据线给苹果手机充电为例,介绍适配器模式的用法,代码十分简单

    三种角色:

    复制代码
        /// <summary>
        /// 安卓数据线,adaptee角色
        /// </summary>
        public class AndroidLine
        {
            public void AndroidCharge()
            {
                Console.WriteLine("安卓数据线充电....");
            }
        }
    
        /// <summary>
        /// 苹果手机充电接口,目标接口
        /// </summary>
        public interface IApplyCharge
        {
            void ApplyChange();
        }
    
        /// <summary>
        /// 苹果适配器 适配器角色
        /// </summary>
        public class ApplyAdapter : IApplyCharge
        {
            AndroidLine androidLine = new AndroidLine();//适配器内部包含一个Adaptee对象
            public void ApplyChange()
            {
                androidLine.AndroidCharge();//客户端调用时,表面上是用的是ApplyChange方法,本质还是用的AndroidCharge方法
            }
        }
    复制代码

    客户端调用:

    复制代码
        class Program
        {
            static void Main(string[] args)
            {
                //获取一个target的实例
                IApplyCharge applyAdapter = new ApplyAdapter();
                applyAdapter.ApplyChange();//表面上用的苹果充电方法ApplyChange,本质上还是用的安卓充电方法AndriodChange。
    
                Console.ReadKey();
            }
        }
    复制代码

    运行程序如下:

     2.小结

    上边例子的类图

    适配器的使用场景:

      系统想使用一个类,但是这个类的接口不符合系统的要求时使用适配器模式。

    适配器模式的优点:

      1.提高代码复用,复用了Adaptee中的方法

      2.灵活性好,如没有关联的两个类A和类B,类A想借用类B的方法,可以在类A中添加一个类B的实例,然后调用类B实例的方法即可。

    适配器模式的缺点:

      1.过多使用适配器会让会同凌乱,如我们明明调用的是A接口的功能,但是却被适配成了B接口的功能。

  • 相关阅读:
    php
    nginx
    docker
    pyenv 配置python虚拟环境
    [运维笔记] Nginx编译安装
    [运维笔记] Mysql单库备份脚本
    BurpSuite Intruder 4种攻击模式
    java判断一个单向链表是否有环路
    二分查找(递归和非递归)
    反转链表算法题
  • 原文地址:https://www.cnblogs.com/frank0812/p/11280195.html
Copyright © 2011-2022 走看看