深入理解Java设计模式之适配器模式
目录
- 一、什么是适配器模式
- 二、适配器模式的结构
- 三、适配器模式的使用场景
- 四、适配器模式的优缺点
- 五、适配器模式的实现
- 1.类适配器模式
- 2.对象适配器模式
- 六、适配器模式的.NET应用
- 总结
一、什么是适配器模式 定义:适配器模式属于结构型模式,把一个类的接口变成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。
【深入理解Java设计模式之适配器模式】适配器模式又可以分为4种类型,类适配器模式、对象适配器模式、单接口适配器模式(缺省适配器模式)和双向适配器模式。后2种模式的实现比较复杂并且在实际开发过程中很少使用。
二、适配器模式的结构
文章图片
Adaptee
:初始角色,实现了我们想要使用的功能,但是接口不匹配Target
:目标角色,定义了客户端期望的接口Adapter
:适配器角色,实现了目标接口。实现目标接口的方法是:内部包含一个Adaptee的对象,通过这个对象调用Adaptee的原有方法实现目标接口。(注:这里说的是对象适配器)三、适配器模式的使用场景 当前打开我这篇文章的笔记本电脑,电源的另一边不正连着一块适配器吗?你平时想将三口插座插进二口插座里面,不也需要一个适配器吗?整天插在插座上的手机充电头,不也是一个适配器吗?
1、系统需要复用现有类,而该类的接口不符合系统的需求;
2、想要建立一个可重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作;
3、对于对象适配器模式,在设计里需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。
四、适配器模式的优缺点 优点:
1、可以让任何两个没有关联的类一起运行;
2、可以在不修改原有代码的基础上来复用现有类,很好地符合 “开闭原则”;
3、增加了类的透明度和更好的灵活性。
缺点:
1、由于C#不支持多重继承,所以最多只能适配一个适配者类,而且目标类必须是抽象类;
2、采用了类和接口的“双继承”实现方式,带来了不良的高耦合。
五、适配器模式的实现
1.类适配器模式
namespace 设计模式之适配器模式{/// /// 这里手机充电器为例,我们的家的插座是两相电的,但是手机的插座接头是三相电的/// class Client{static void Main(string[] args){//好了,现在可以充电了ITwoHoleTarget change = new ThreeToTwoAdapter(); change.Request(); Console.ReadLine(); }}/// /// 我家只有2个孔的插座,也就是适配器模式中的目标角色(Target),这里只能是接口,也是类适配器的限制/// public interface ITwoHoleTarget{void Request(); }/// /// 3个孔的插头,源角色——需要适配的类(Adaptee)/// public abstract class ThreeHoleAdaptee{public void SpecificRequest(){Console.WriteLine("我是三个孔的插头"); }}/// /// 适配器类,接口要放在类的后面,在此无法适配更多的对象,这是类适配器的不足/// public class ThreeToTwoAdapter:ThreeHoleAdaptee,ITwoHoleTarget{/// /// 实现2个孔插头接口方法/// public void Request(){// 调用3个孔插头方法this.SpecificRequest(); }}}
2.对象适配器模式
namespace 对象的适配器模式{//////家里只有两个孔的插座,也懒得买插线板了,还要花钱,但是我的手机是一个有3个小柱子的插头,明显直接搞不定,那就适配吧///class Client{static void Main(string[] args){//好了,现在就可以给手机充电了TwoHoleTarget homeTwoHole = new ThreeToTwoAdapter(); homeTwoHole.Request(); Console.ReadLine(); }}/// /// 我家只有2个孔的插座,也就是适配器模式中的目标(Target)角色,这里可以写成抽象类或者接口/// public class TwoHoleTarget{// 客户端需要的方法public virtual void Request(){Console.WriteLine("两孔的充电器可以使用"); }}/// /// 手机充电器是有3个柱子的插头,源角色——需要适配的类(Adaptee)/// public class ThreeHoleAdaptee{public void SpecificRequest(){Console.WriteLine("我是3个孔的插头也可以使用了"); }}/// /// 适配器类,TwoHole这个对象写成接口或者抽象类更好,面向接口编程嘛/// public class ThreeToTwoAdapter : TwoHoleTarget{// 引用两个孔插头的实例,从而将客户端与TwoHole联系起来private ThreeHoleAdaptee threeHoleAdaptee = new ThreeHoleAdaptee(); //这里可以继续增加适配的对象。。/// /// 实现2个孔插头接口方法/// public override void Request(){//可以做具体的转换工作threeHoleAdaptee.SpecificRequest(); //可以做具体的转换工作}}}
六、适配器模式的.NET应用 在.NET中有一个类库已经实现且非常重要的适配器,那就是DataAdapter。DataAdapter用作DataSet和数据源之间的适配器以便检索和保存数据,DataAdapter通过映射Fill(这更改了DataSet中的数据以便与数据源中的数据相匹配)和Update(这更改了数据源中的数据以便与DataSet中的数据相匹配)来提供这一适配器。
由于数据源可能来自于SQL Server,可能来自于Oracel,也可能来自于DB2、MySql,这些数据在组织上可能有不同之处,但我们希望得到统一的DataSet(实质是XML数据),此时用DataAdapter就是非常好的手段,我们不必关注不同数据库的数据细节,就可以灵活的使用数据。
总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 深入理解Go之generate
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 由浅入深理解AOP
- 事件代理
- 逻辑回归的理解与python示例
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 【1057快报】深入机关,走下田间,交通普法,共创文明
- 数组常用方法一