• 07 Adapter(structual Pattern)


    适配器,在不改变原有实现的基础上,将原先不兼容的接口转换为兼容的接口
    Motivation
      在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。
    意图(Intent)
      将一个类的接口转换成客户希望的另一个接口。
      Adapter模式使得原本由于接口不兼容而不能一起工作的那些类一块工作
      Adapter模式的几个要点
      Adapter模式主要应用于“希望复用一些现存的类”,但是接口又与复用环境要求不一致的情况,在遗留代码复用。类库迁移等方面非常有用

    两种实现接口:对象适配器和类适配器。
      类适配器采用多继承的实现方式,带来了不良的高耦合,不建议使用
      对象适配器采用“对象组合”的方式,更符合松耦合精神
        Adapter模式本身要求我们尽可能使用“面向接口的编程”便于后期维护
      .NET框架中的Adapter应用
        1.在.NET中复用com对象
          -COM对象不符合.NET对象的接口
          -使用tlbimp.exe来创建一个Runtime Callable Wrapper(RCW)以便使符合.NET对象的接口
        2.NET数据访问类(Adapter变体):
          -各种数据库并没有提供DataSet接口
          -使用DbDataAdapter可以讲任何各数据库访问/存取适配到一个DataSet对象上。
        3.集合类中对现有对象的排序(Adapter变体)
          -现有对象未实现IComparable接口
          -实现一个排序适配器(继承IComparerable接口),然后再Compare方法中对两个对象进行比较。

    View Code
     1     //客户期望的接口
     2     public interface IStack
     3     {
     4         void Push(object item);
     5         void Pop();
     6         object Peek();//只取出顶上的对象
     7     }
     8     ////对象适配器   更多使用这个
     9     //class MyStack:IStack//适配器
    10     //{
    11     //    ArrayList list;//被适配的对象
    12     //    public MyStack()
    13     //    {
    14     //        list = new ArrayList();
    15     //    }
    16     //    public void Push(object item)
    17     //    {
    18     //        list.Add(item);
    19     //    }
    20     //    public void Pop()
    21     //    {
    22     //        list.RemoveAt(list.Count - 1);
    23     //    }
    24     //    public object Peek()
    25     //    {
    26     //        return list[list.Count - 1];
    27     //    }
    28     //}
    29 
    30     //类适配器
    31 
    32     //C++可以实现类的多继承 类的可控性
    33     //不建议:违反了单一原则  只能是单根继承
    34     class MyStack : ArrayList, IStack//适配器
    35     {
    36         public void Push(object item)
    37         {
    38             this.Add(item);
    39         }
    40         public void Pop()
    41         {
    42             this.RemoveAt(this.Count - 1);
    43         }
    44         public object Peek()
    45         {
    46             return this[this.Count - 1];
    47         }
    48     }
    49 
    50     public class ExistingClass
    51     {
    52         public void SpecificRequest1()
    53         {
    54         }
    55         public void SpecificRequest2()
    56         {
    57         }
    58     }
    59     //目标接口  新环境所使用的接口
    60     public interface ITarget
    61     {
    62         void Request();
    63     }
    64     public class MySystem
    65     {
    66         public void Process(ITarget target)
    67         {
    68 
    69         }
    70     }
    71     public class Adapter : ITarget
    72     {
    73         ExistingClass adaptee;
    74         public void Request()
    75         {
    76             adaptee.SpecificRequest1();
    77             adaptee.SpecificRequest2();
    78         }
    79     }
  • 相关阅读:
    线程池参数详解
    线程池各个参数详解以及如何自定义线程池
    fastdfs 安装
    SQL 执行顺序
    《SQL 进阶教程》 查找局部不一致的数据
    redis 高性能的原因
    一致性hash
    环境部署数据库报错
    redis 常用命令
    redis 高级学习和应用场景
  • 原文地址:https://www.cnblogs.com/cheshui/p/2708524.html
Copyright © 2020-2023  润新知