夜微凉、的博客

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1 适配器模式的定义

在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

2 实际应用中的例子

在生活中,我们买的手机充电器插头是2个孔的,但是我们买的插座只有三个孔的,此时我们就希望充电器的插头可以转换为三个孔的就好,这样我们就可以直接把它插在插座上,

此时三个孔插头就是客户端期待的另一种接口,自然两个孔的插头就是现有的接口,适配器模式就是用来完成这种转换的,具体实现代码如下:

类适配器模式实现


 

三角插座-现有的插头

    /// <summary>
    /// 三角插头接口-现有的插座
    /// </summary>
    public interface IThreeHole
    {
        /// <summary>
        /// 输出
        /// </summary>
        void AdpatePrint();
    }

双脚插头-用户期待的插头

 1     /// <summary>
 2     /// 两脚插头
 3     /// </summary>
 4     public abstract class TwoHole
 5     {
 6         public void Print()
 7         {
 8             Console.WriteLine("启用两脚插头...");
 9         }
10     }

适配器:

    /// <summary>
    /// 适配器
    /// </summary>
    public class AdpateManage : TwoHole,IThreeHole
    {
        public void AdpatePrint()
        {
            this.Print();
        }
    }

测试:

1     class Program
2     {
3         static void Main(string[] args)
4         {
5             IThreeHole threeHole = new AdpateManage();
6             threeHole.AdpatePrint();
7             Console.ReadKey();
8         }
9     }

三角插头(接口)期待执行 双脚插头的 Print() 方法,可以通过适配器继承三角插头接口双脚插头类,从而实现调度。

执行Print() 方法。


对象的适配器模式

上面都是类的适配器模式的介绍,然而适配器模式还有另外一种形式——对象的适配器模式,

这里就具体讲解下它的实现思路:既然现在适配器类不能继承TwoHole抽象类了(因为用继承就属于类的适配器了),但是适配器类无论如何都要实现客户端期待的方法的,即 AdpatePrint() 方法,

所以一定是要继承ThreeHole抽象类或IThreeHole接口的,然而适配器类的 AdpatePrint() 方法又必须调用TwoHole的 Print()  方法,又不能用继承,这时候就想,不能继承,

但是我们可以在适配器类中创建TwoHole对象,然后在Requst中使用TwoHole的方法了。正如我们分析的那样,对象的适配器模式的实现正式如此。下面就让我看看具体实现代码:

三角插座-现有的插头

    /// <summary>
    /// 三角插头-现有的
    /// </summary>
    public abstract class _ThreeHole
    {
        public virtual void AdpatePrint()
        {
            Console.WriteLine("三角插头工作中。。。。");
        }
    }

双脚插头-用户期待的插头

    /// <summary>
    /// 两脚插头-用户期待的
    /// </summary>
    public class _TwoHole
    {
        public void Print()
        {
            Console.WriteLine("启用两脚插头...");
        }
    }

适配器:

    /// <summary>
    /// 适配器
    /// </summary>
    public class _AdpateManage : _ThreeHole
    {
        /// <summary>
        /// 获取两脚插头对象
        /// </summary>
        _TwoHole twoHole = new _TwoHole();

        public override void AdpatePrint()
        {
            this.twoHole.Print();
        }
    }

测试:

   class Program
    {
        static void Main(string[] args)
        {
            _ThreeHole threeHole = new _AdpateManage();
            threeHole.AdpatePrint();
            Console.ReadKey();
        }
    }

在以下情况下可以考虑使用适配器模式:

  1. 系统需要复用现有类,而该类的接口不符合系统的需求
  2. 想要建立一个可重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
  3. 对于对象适配器模式,在设计里需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。

 

posted on 2018-02-28 22:22  夜、微凉  阅读(1775)  评论(0编辑  收藏  举报