[关闭]
@BertLee 2017-08-16T23:49:22.000000Z 字数 1842 阅读 774

结构式之适配器模式

序言

  适配器模式有3种类型,分别是类的适配器模式,对象的适配器模式,缺省的适配器模式,下面分别介绍。
适配器模式的几种角色:

1. 类的适配器模式

类的适配器结构如下图:



套路:
1. 将新旧方法统一到接口中
2. 创建适配器类,继承旧类,实现接口

  1. /**
  2. * 原有插座,只提供两孔插座
  3. */
  4. public class Socket {
  5. public void provideTwoHoles(){
  6. System.out.println("提供两孔插座");
  7. }
  8. }
  1. /**
  2. * 插座接口,有2孔,也有3孔
  3. */
  4. public interface SocketInterface {
  5. public void provideTwoHoles();
  6. public void provideThreeHoles();
  7. }
  1. /**
  2. * 插座适配器,提供3孔插座和2孔插座
  3. */
  4. public class SocketAdapter extends Socket implements SocketInterface{
  5. //原有插座没有该方法
  6. public void provideThreeHoles() {
  7. //3孔插座相关代码
  8. //可调用原有插座方法super.provideTwoHoles();
  9. System.out.println("提供3孔插座");
  10. }
  11. }
  1. /**
  2. * 测试对象适配器,提供3孔插座
  3. */
  4. public class AdapterObjectTest {
  5. @Test
  6. public void testAdapterObject(){
  7. SocketAdapter socketAdapter = new SocketAdapter(new Socket());
  8. socketAdapter.provideThreeHoles();
  9. }
  10. }

吹牛:
  好处:适配器类通过继承的方式来完成新旧的转化,而且还可以重写原类中的方法
  坏处:只能适配源类,不能适配其子类,当有这样的需求时,每次都要写一个适配器类,比较麻烦

2. 对象的适配器模式

对象的适配器结构如下图:



套路:
1. 将新旧方法统一到接口中
2. 创建适配器类,实现接口,采用委托的形式完成新旧转化

  1. /**
  2. * 原有插座,只提供两孔插座
  3. */
  4. public class Socket {
  5. public void provideTwoHoles(){
  6. System.out.println("提供两孔插座");
  7. }
  8. }
  1. /**
  2. * 插座接口,有2孔,也有3孔
  3. */
  4. public interface SocketInterface {
  5. public void provideTwoHoles();
  6. public void provideThreeHoles();
  7. }
  1. /**
  2. * 插座适配器,提供3孔插座和2孔插座
  3. */
  4. public class SocketAdapter implements SocketInterface {
  5. private Socket socket;
  6. //通过构造方法,初始化原对象
  7. public SocketAdapter(Socket socket){
  8. this.socket = socket;
  9. }
  10. //直接复用原对象方法
  11. public void provideTwoHoles() {
  12. socket.provideTwoHoles();
  13. }
  14. //提供新接口,3孔插口
  15. public void provideThreeHoles() {
  16. //3孔插座相关代码
  17. //可调用原有插座方法super.provideTwoHoles();
  18. System.out.println("提供3孔插座");
  19. }
  20. }

吹牛: 适配器类可以适配多个原类及其子类,比较灵活,较为常用

3. 缺省的适配器模式

具体类实现接口时,具体类会实现接口里所有的方法,可是有时并不需要实现里面所有的方法,这时,缺省的适配器模式就派上用场了,做法是在具体类和接口中间横插一杠子,建一个抽象类,实现接口,但方法体都是空的,让具体类继承抽象类,即可解决该问题。

后记

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注