• 设计模式——适配器模式(Adapter Pattern)


    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. 对于对象适配器模式,在设计里需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。
  • 相关阅读:
    前端3 浮动布局,固定定位,绝对定位,相对定位
    前端2 字体|文本属性样式, 高级选择器
    前端1.概念
    前端,基础选择器,嵌套关系.display属性,盒模型
    数据库之索引
    数据库之进阶(视图,事务,存储过程)
    数据库,多表数据
    数据库之表的使用
    数据的演化(数据仓库的发展史)
    HDFS退出安全模式
  • 原文地址:https://www.cnblogs.com/wwj1992/p/8486145.html
Copyright © 2020-2023  润新知