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

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

2014-03-04 22:04 218 查看
适配器这个词应该不算陌生吧。。。本本用的变压器专业点就叫电源适配器,因为本本受不了那么高的电压。

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

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

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

举个例子,我们的学生管理系统有一个接口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里面的函数不能是虚函数,只能是空函数

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

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

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

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

使用的地方。。。就是要用一些不符合系统要求的或是没有源代码的借口,或者是包括一些可能在将来引进的类一起工作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息