代码都很简答,谁都可以看得懂,也有详细的备注.
三,适配器模式的实现要点:
1,Adapter 模式主要应用于 "希望复用一些现存的类,但是接口又与复用环境要求不一致的情况",在遗留代码复用,类库迁移等方面非常有用.
2,GoF23 定义了两种 Adapter 模式的实现结构:对象适配器和类适配器.类适配器采用 "多继承" 的实现方式,在 C#语言中,如果被适配角色是类,Target 的实现只能是接口,因为 C#语言只支持接口的多继承的特性.在 C# 语言中类适配器也很难支持适配多个对象的情况,同时也会带来了不良的高耦合和违反类的职责单一的原则,所以一般不推荐使用.对象适配器采用 "对象组合" 的方式,更符合松耦合精神,对适配的对象也没限制,可以一个,也可以多个,但是,使得重定义 Adaptee 的行为较困难,这就需要生成 Adaptee 的子类并且使得 Adapter 引用这个子类而不是引用 Adaptee 本身.Adapter 模式可以实现的非常灵活,不必拘泥于 GoF23 中定义的两种结构.例如,完全可以将 Adapter 模式中的 "现存对象" 作为新的接口方法参数,来达到适配的目的.
3,Adapter 模式本身要求我们尽可能地使用 "面向接口的编程" 风格,这样才能在后期很方便地适配.
适配器模式用来解决现有对象与客户端期待接口不一致的问题,下面详细总结下适配器两种形式的优缺点.
1] ,类的适配器模式:
优点:
(1),可以在不修改原有代码的基础上来复用现有类,很好地符合 "开闭原则"
(2),可以重新定义 Adaptee(被适配的类) 的部分行为,因为在类适配器模式中,Adapter 是 Adaptee 的子类
(3),仅仅引入一个对象,并不需要额外的字段来引用 Adaptee 实例(这个即是优点也是缺点).
缺点:
(1),用一个具体的 Adapter 类对 Adaptee 和 Target 进行匹配,当如果想要匹配一个类以及所有它的子类时,类的适配器模式就不能胜任了.因为类的适配器模式中没有引入 Adaptee 的实例,光调用 this.SpecificRequest 方法并不能去调用它对应子类的 SpecificRequest 方法.
(2),采用了 "多继承" 的实现方式,带来了不良的高耦合.
2] ,对象的适配器模式 优点:
(1),可以在不修改原有代码的基础上来复用现有类,很好地符合 "开闭原则"(这点是两种实现方式都具有的)
(2),采用 "对象组合" 的方式,更符合松耦合.
缺点:
(1),使得重定义 Adaptee 的行为较困难,这就需要生成 Adaptee 的子类并且使得 Adapter 引用这个子类而不是引用 Adaptee 本身.
3] ,适配器模式使用的场景:
(1),系统需要复用现有类,而该类的接口不符合系统的需求
(2),想要建立一个可重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作.
(3),对于对象适配器模式,在设计里需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际.
四,.NET 中适配器模式的实现
说道适配器模式在 Net 中的实现就很多了,比如:System.IO 里面的很多类都有适配器的影子,当我们操作文件的时候,其实里面调用了 COM 的接口实现.以下两点也是适配器使用的案例:
1. 在. NET 中复用 COM 对象:
COM 对象不符合. NET 对象的接口,使用 tlbimp.exe 来创建一个 Runtime Callable Wrapper(RCW)以使其符合. NET 对象的接口,COM Interop 就好像是 COM 和. NET 之间的一座桥梁.
2..NET 数据访问类(Adapter 变体):
各种数据库并没有提供 DataSet 接口,使用 DbDataAdapter 可以将任何个数据库访问 / 存取适配到一个 DataSet 对象上,DbDataAdapter 在数据库和 DataSet 之间做了很好的适配.当然还有 SqlDataAdapter 类型了,针对微软 SqlServer 类型的数据库在和 DataSet 之间进行适配.
五,总结
今天的文章就写到这里了,在结束今天写作之前,有一句话还是要说的,虽然以前说过.每种设计模式都有自己的适用场景,它是为了解决一类问题,没有所谓的缺点,没有一种设计模式可以解决所有情况的.我们使用设计模式的态度是通过不断地重构来使用模式,不要一上来就使用设计模式,为了模式而模式.如果软件没有需求的变化,我们不使用模式都没有问题.遇到问题,我们就按着常规来写,有了需求变化,然后我们去抽象,了解使用的场景,然后在选择合适的设计模式.
来源: http://www.bubuko.com/infodetail-2473633.html