设计模式笔记之适配器模式

适配器这个词应该不算陌生吧。。。本本用的变压器专业点就叫电源适配器,因为本本受不了那么高的电压。

所以适配器模式呢,就是为了给两种类或者接口搭桥用的~

所以这个模型就显而易见了, 一个适配器,一个适配者,一个具体业务分类

适配器的任务就是连接适配者跟具体业务的桥梁。使用这种模式多部分是因为适配者跟具体业务之间的接口不对应。

举个例子,我们的学生管理系统有一个接口sort是用于给学生的成绩排序,之后我们又从不知名的地方找到了快速排序的qsort方法,但是由于某些原因这个qsort的源代码丢失,无法更改复制代码,这时候就是我们的适配器模式大显身手的时候了。。。(虽然我很想吐槽,快排我不用显示器都能打出来。。。)

适配器模式又分为类适配器和对象适配器两种,各有优点吧。。。

类适配器:

namespace TransferMode
{
    interface Target
    {
        void TargetFun();
    }
    class Adaptee
    {
        public void AdapteeFun()
        {
            Console.WriteLine("this");
        }
    }
    class Adapter:Adaptee,Target
    {
        public void TargetFun()
        {
            base.AdapteeFun();
        }
    }
}
这个模式实际上就是让中间的Adapter承两边需要适配的Adaptee和Target,然后利用Target提供的TargetFun接口来调用原来的AdapteeFun方法,所以这种模式的弊端也比较明显,因为C#禁止多继承,所以Target大部分情况都是接口,因为毕竟Adaptee的方法已经写好,而且很可能因为什么原因导致不可更改或者复制。

对象适配器:

namespace TransferMode
{
    class Adaptee
    {
        public void AdapteeFun()
        {
            Console.WriteLine(this);
        }
    }
    class Adapter:Adaptee
    {
        public Adaptee adaptee;
        public Adapter(Adaptee adaptee)
        {
            this.adaptee = adaptee;
        }
        public void TargetFun()
        {
            adaptee.AdapteeFun();
        }
    }
}
这种情况更像是一种包装,中间类Adapter中包含了Adaptee的一个实例,通过Adapter中的TargeFun方法调用Adaptee的AdapteeFun方法来将两者连接,这样Target类就可以不只是接口,而且也不用改变Adaptee和Target的代码。

此外,还有一个缺省适配器模式(说实在的,这章看的挺头疼的。。。感觉比前几章麻烦多了。。。T_T)

这个模式跟之前的略有不同。。。

这个模式虽然也有三个角色,适配者接口,缺省适配器,具体业务。

适配者接口,顾名思义,就是一个接口,里面声明了很多方法

缺省适配器,仍然是一个很重要的角色,它使用空方法继承了所有适配者接口中声明的方法,而且一般多为抽象类,因为实例化,貌似没有什么意义?

具体业务类:继承缺省适配器,根据需要覆盖缺省适配器中的函数

namespace TransferMode
{
    interface IServiceInterface
    {
        void Fun1();
        void Fun2();
        void Fun3();
    }
    abstract class AbstratServiceClass:IServiceInterface
    {
        public void Fun1() { }
        public void Fun2() { }
        public void Fun3() { }
    }
    class ConcreteServiceClass:AbstratServiceClass
    {
        public void Fun1()
        {
            Console.WriteLine(this);
        }
    }
}
就像上面的 ConcreteServiceClass里面只有Fun1,在继承的时候可以根据来进行覆盖,所以AbstratServiceClass里面的函数不能是虚函数,只能是空函数


适配器模式总体的优点嘛。。。就是增加了透明性和复用性,而且灵活性扩展性也很好,更为重要的是由于适配器的引入,无需更改原有的结构,维护比较方便


至于类对象适配器的优点呢?就是一个适配器可以吧多个不同的适配者配到同一个目标上。

但是缺点也很明显,就想之前说的,由于单继承,一次最多只能适配一个适配者,而且要求目标必须是接口。。。


对象配置器优点跟前面说的差不多,缺点就是在适配器中置换适配者类的某些方法比较麻烦。当然,也有解决方法,就是先做一个适配者的自雷,然后将适配者的方法都置换掉,然后将该子类当作真正的适配者类进行适配。


使用的地方。。。就是要用一些不符合系统要求的或是没有源代码的借口,或者是包括一些可能在将来引进的类一起工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值