您的位置:首页 > 编程语言 > C#

C#设计模式——适配器模式

2016-02-03 14:25 288 查看
适配器模式:

大家有没有想过一个问题,电脑充电为何会有电源适配器?直接220V充电不是很快吗?答案原来在这里,笔记本工作电压很小,如果直接连接220V的电压可能会烧毁笔记本,所以我们需要一个东西来解决这个问题,那就是电源适配器。这是电源适配器,那么在软件工程中,我们又该如何用编码来实现适配器呢?这就是今天我想为大家介绍的适配器模式。
一、定义:
将一个类的接口转换成客户希望的另外一个接口。它可以使接口不兼容的类一起工作。
二、解决问题:
主要解决在软件系统中,常常要将一些“现存的对象”放到新的环境中,而新环境要求的接口是现对象不能满足的。
三、对象适配器优缺点:
1、优点:

可以在不修改原有代码的基础上来复用现有类,很好地符合 “开闭原则“。

采用 “对象组合”的方式,更符合松耦合。

2、缺点:

使得重定义Adaptee的行为较困难,这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。

四、应用:

1、适配器模式结构图:



理解结构图:
根据对象适配器模式结构图,在对象适配器中,客户端需要调用request()方法,而适配者类Adaptee没有该方法,但是它所提供的specificRequest()方法却是客户端所需要的。为了使客户端能够使用适配者类,需要提供一个包装类Adapter,即适配器类。这个包装类包装了一个适配者的实例,从而将客户端与适配者衔接起来,在适配器的request()方法中调用适配者的specificRequest()方法。因为适配器类与适配者类是关联关系(也可称之为委派关系),所以这种适配器模式称为对象适配器模式。

拿我们书中的例子来说,姚明刚开始到外国,在NBA和外国教练交流,但是姚明听不懂,所以他需要一个翻译。从这里来说,教练是客户端,姚明就是那个适配者类Adaptee,但是姚明有个打篮球的方法是教练需要的,为了让教练能和姚明交流,,需要一个翻译,这个翻译就是适配器类,它包装了“翻译”这个方法,通过它,教练和姚明就接上话了,实现了交流。
2、代码展示:
//Target
    class Target
    {
        public virtual void Request()
        {
            Console.WriteLine("普通请求!");
        }
    }
    //Adaptee 需要适配的类
    class Adaptee
    {
        public void SpecificRequest()
        {
            //Console.WriteLine("Called SpecificRequest()");
            Console.WriteLine("特殊请求!");
        }
    }
    //Adapter 通过在内部包装一个Adaptee对象,把源接口转换成目标接口
    class Adapter : Target
    {
        private Adaptee adaptee = new Adaptee();//建立一个私有的Adaptee对象
        public override void Request()
        {
            adaptee.SpecificRequest();//这样可以把表面上调用Request()方法变成实际调用SpecificRequest()
        }
    }
    //客户端调用
    class Program
    {
        static void Main(string[] args)
        {
            Target target = new Adapter();
            target.Request();
            Console.Read();
        }
    }


3、适用情况:
(1)当系统的数据和行为都不正确,但接口不符时,我们考虑用适配器
目的:使控制范围之外的一个原有对象与某个接口匹配。
(2)在使用一个已经存在的类,但如果他的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式:两个类所做的事情相同或相似,但是具有不同的接口时使用它。
(3)双方都不太容易修改的时候再使用适配器模式适配,而不是一有不同就用。

五、总结:
适配器模式将两个不相关的类联系起来,将接口不兼容的问题处理的很漂亮,这就是我对有关适配器模式的理解,有不合理之处,也欢迎大家提出宝贵的意见。

感谢你的阅读!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: