在学习SpringMVC框架时,看到源码中使用了适配器设计模式,不学习一下这种设计模式还真是看不懂源码了。经过一个上午的学习写下了这篇文章,用以记录。
适配器设计模式能解决什么问题?
答:使得原本由于接口不兼容不能在一起工作、不能统一管理的类可以在一起工作、可以进行统一管理。
举例解释
有三个工种,教师,程序员,厨师、他们分别有着与其工作相关的方法, teach(), program(), cook() 。
有对应的接口 : Teacher , Programmer , Cooker
接口中的方法 : teach() , program() , cook()
有对应的实现类 :TeacherImpl , ,ProgrammerImpl , CookerImpl
需求:打印出这三个工种所做的工作内容。
不使用适配模式的时候,可以这样写:
这样写的缺点是:要知道每一个接口里面指定的方法。
为了解决这个问题,我们先使用一种单个适配器的模式(目的是:引出多适配器)
单个适配器:
单个适配器类似于工具类,其提供了一个方法 work(Object worker) ,根据传进来的worker类型调用对应的方法。
这样就不需要知道每一个接口内部都写了什么方法了。
1.适配器接口:
2.实现类
3.测试类
单个适配器不需要再去了解每个接口内都写了什么方法了,只需要统一调用work()就可以实现需求了。
但是单个适配器的缺点 : 如果增加了新的工种,需要修改适配器实现类,如果增加了一百种,一千种呢?所以这不是解决问题的方法。
多个适配器:
使用单个适配器的问题已经说过了,怎么去解决呢? 答案就是使用多适配器,如果每一个工种都有对应的适配器接口实现类的话,就可以通过统一管理对应的适配器接口实现类(因为都实现了相同的接口,所以可以统一管理),进而统一管理不同的工种,大致思路为:
1.为每一个工种都建立一个对应的适配器接口实现类,实现类中调用对应工种的方法。
2.在使用时,需要先获取到所有的适配器,然后遍历需求中给出的所有的工人,再嵌套循环遍历每一个适配器,找出与传入工人对应的适配器(因为这个需求,所以在适配器接口中应该有一个boolean isSupport( Object worker)方法,来判断这个适配器是否支持传入的worker),找到对应的适配器后,调用work()方法就实现了统一管理。
代码:
1.适配器接口
2.不同工种对于适配器的的实现
3.测试类
多个适配器的缺点:需要为每一个工种添加一个适配器
我之所以只截图不粘代码,目的是让各位都能看,但是如果想跑一下就必须自己写,只有写一遍才会有所感悟。