zoukankan      html  css  js  c++  java
  • 设计模式-适配器模式

    在现实生活中我们也经常会用到适配器,比喻我们经常用的电脑适配器,你说不用适配器怎么充电吧,但是我们发现电脑适配器也有条件,第一你得有电吧,没有电的话就没有适配器什么事情,第二    你得有电脑吧,没有电脑适配器怎么用。所以在这个简单例子中我们发现我们为啥使用适配器,那是因为我不使用适配器我没法给我的电脑充电啊,是无耐之举。所以有的人在项目还没开始的时候就  说用适配器模式我是不赞成的。因为那个时候你项目还没开始你直接继承你规定的接口不就可以了么,何必用适配器呢。以下我们就可以总结适配器的三个特征

     目标角色:这就是所期待得到的接口。也就是上面说的电脑需要的插口

     源角色:现在需要适配的接口。也就是咱们现在现有的电

     适配器角色:适配器类是本模式的核心。也就是把家用220v电转换咱们电脑需要的电

    下面我用一个简单demo来说明适配器模式先看一幅图(不是实现上面例子)

    类适配器代码

    1:定义我们需要的目标接口

     1         /// <summary>
     2     /// 目标类供客户端调用
     3     /// </summary>
     4     public interface ITarget
     5     {        
     6         /// <summary>
     7         /// 充电
     8         /// </summary>
     9         /// <returns></returns>
    10         bool Charging(int isFinish);
    11     }
    目标接口

    2:我们现有三星和苹果的充电器的源码如下

     1 /// <summary>
     2     /// 苹果充电器类
     3     /// </summary>
     4     public class AppleCharger {
     5         /// <summary>
     6         /// 是否完成充电
     7         /// </summary>
     8         /// <param name="isFinish">0:表示完成,1:表示未完成</param>
     9         /// <returns></returns>
    10         public int Charging(int isFinish)
    11         {
    12             return isFinish;
    13         }
    14     }
    15 
    16 /// <summary>
    17     /// 三星充电器类
    18     /// </summary>
    19     public class SamsungCharger {
    20         /// <summary>
    21         /// 充电是否完成
    22         /// </summary>
    23         /// <param name="isFinish">"0":完成"1":未完成</param>
    24         /// <returns></returns>
    25         public string Charging(string isFinish)
    26         {
    27             return isFinish;
    28         }
    29     }
    固有类

    3:我们发现我们现在需要的接口是bool但是原来的接口都不统一,但是呢我还要用以前的功能这个时候就要用适配器去匹配了

     1 /// <summary>
     2     /// 苹果充电器
     3     /// </summary>
     4     public class AppleChargerAdapter : AppleCharger, ITarget
     5     {
     6         public new bool Charging(int isFinish)
     7         {
     8             return base.Charging(isFinish) == 0;
     9         }
    10     }
    苹果适配器
    1 /// <summary>
    2     /// 三星充电器
    3     /// </summary>
    4     public class SamsungChargerAdapter : SamsungCharger, ITarget {
    5         public bool Charging(int isFinish) {
    6             return base.Charging(isFinish.ToString()) == "0";
    7         }
    8     }
    三星适配器

    对象适配器代码

     1 /// <summary>
     2     /// 苹果充电器
     3     /// </summary>
     4     public class AppleChargerAdapter :ITarget
     5     {
     6         private AppleCharger _appleCharger;
     7 
     8         public bool Charging(int isFinish)
     9         {
    10             _appleCharger = new AppleCharger();
    11             return _appleCharger.Charging(isFinish) == 0;
    12         }
    13     }
    苹果适配器
     1 /// <summary>
     2     /// 三星充电器
     3     /// </summary>
     4     public class SamsungChargerAdapter : ITarget
     5     {
     6 
     7         private SamsungCharger _samsungCharger;
     8 
     9         public bool Charging(int isFinish)
    10         {
    11             _samsungCharger = new SamsungCharger();
    12             return _samsungCharger.Charging(isFinish.ToString()) == "0";
    13         }
    14     }
    三星适配器

    最后我们看一下客户端的调用

     1  ITarget apple = new AppleChargerAdapter();
     2             ITarget samsung = new SamsungChargerAdapter();
     3 
     4             if (apple.Charging(0))
     5             {
     6                 Console.WriteLine("苹果适配器完成充电");
     7             }
     8             if (samsung.Charging(0))
     9             {
    10                 Console.WriteLine("三星适配器完成充电");
    11             }
    客户端调用

    效果:

    适配器使用场景:

    你拥有:

    1:一个领域特定的接口(提供客户端使用)

    2:一个类,需要通过不匹配的接口来使用它。

    你想要:

    1:创建一个可复用的类跟目前尚未完成的类合作(有点像装饰模式)

    2:改变方法被调用时候或被实现时候的名字(比喻你的接口删除是remove,但是这个你要复用的类却是delete)

    3:为不同的目的支持不同方法的集合

     选择你的适配器

    类适配器:

    1:是继承关系属于静态的定义方式

    2:不可以使用需要适配类的子类,比较灵活简单。

    对象适配器:

    1:属于动态组合关系

    2:可以使用需要适配类的子类扩展性强

  • 相关阅读:
    读写excel的组件
    一个关于C#语言中的Property的低级BUG,花了我二十分钟
    使用wwAppConfiguration类库来轻松读写应用程序配置信息
    为因地震死难的同胞默哀
    页面执行时生成静态文件的方法
    【转载】sp_spaceused2,看库里全部表占用的物理空间
    在微软中文技术论坛 CSDN cnblogs 三个微软社区中提问
    在内网服务器中获得真正的客户端ip的方法
    深拷贝的通用方法
    你知道在word中如何将段落标记替换成其他字符吗?
  • 原文地址:https://www.cnblogs.com/LipeiNet/p/4961312.html
Copyright © 2011-2022 走看看