适配器模式
Posted xslzjbra
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了适配器模式相关的知识,希望对你有一定的参考价值。
适配器模式在我们生活中算是非常常见了,比如充电器,转接头等。通过这些东西我们可以联想到,适配器模式是需要将我们用不了的东西转换成我们能用的东西。具体的应用场景我们通过代码来分析其实是一目了然的。
需求一:现在我们需要画一个圆,接口A中没有只有画正方形而没有画圆的方法,接口B中刚好有画圆的方法,但是现在蛋疼的是我们必须要使用接口A,要不直接吧接口B中的方法复制到接口A中?这样不就解决了么,,,好像还不错欸,复制粘贴不是我们程序员最擅长的事情么,,,但是仔细想想,这样其实是有一点问题的,,首先会造成代码的冗余,其次如果以后不画圆了,,改画三角形,而接口C中刚好有,怎么办?再继续复制接口C中的代码?再其次,Java实现接口是需要接口的所有方法的,到时候实现类怎么办?这个时候我们就可以使用适配器模式了。有两种适配器模式可以实现。
1. 类适配器模式, 这个模式使用了java的继承。首先我们需要一个接口B的实现类来实现画圆的方法,然后新建一个适配器类来继承接口B的实现类然后实现接口A。这样就搞定了。还是直接上代码吧
/** * created by xushilong on 2018/10/15. */ public interface Circle { void drawCircle(); }
/** * created by xushilong on 2018/10/15. */ public interface Square { void drawSquare(); }
/** * created by xushilong on 2018/10/15. */ public class SquareImpl implements Square { @Override public void drawSquare() { System.out.println("小正方形"); } }
/** * created by xushilong on 2018/10/15. */ public class ShapeAdapter extends SquareImpl implements Circle { @Override public void drawCircle() { drawSquare(); } }
从代码看是不是一目了然。但是这仅仅解决了需求中的接口A中没有而接口B中有。就代码看,现在画的是一个小正方形,如果我们哪天需要画一个中等的正方形怎么办,,而Java是单继承的,这时可以使用另一种适配器模式。
2. 对象适配器模式,这种实现方式和类适配器模式的唯一区别就是适配器类的代码改动了。
/** * created by xushilong on 2018/10/15. */ public class MiddleSquareImpl implements Square { @Override public void drawSquare() { System.out.println("中等正方形"); } }
/** * created by xushilong on 2018/10/15. */ public class ShapeAdapter2 implements Circle { private Square square; public ShapeAdapter2(Square square) { this.square=square; } @Override public void drawCircle() { square.drawSquare(); } }
查看两种实现方式的代码可以看出,相比类适配器模式,对象适配器模式更为的灵活,只需要初始化的时候使用指定的Square实现类就可以来画不同的正方形了,使用这种方法可以把这个适配器类设计为一个可重用的类,这样扩展性好。(优于类适配器模式,推荐使用)
需求二:接口A有很多方法,但是现在我们只想使用接口A种的一到两种,直接实现接口A的话必然我们要实现接口A的所有方法。这并不是我们需要的,这时候也可以使用适配器模式
1. 接口适配器模式, 比如接口A有a,b,c,d,e,f,g等很多种方法,我们可以新建一个抽象类来实现接口A,然后新建一个适配器类来继承这个抽象类,重写我们需要的方法就好了。
/** * created by xushilong on 2018/10/15. */ public interface Shape { void drawCircle(); void drawSquare(); void drawTriangle(); void drawRectangle(); void drawEchelon(); void drawDiamond(); }
/** * created by xushilong on 2018/10/15. */ public abstract class AbstractShape implements Shape{ public void drawCircle() {} public void drawSquare() {} public void drawTriangle() {} public void drawRectangle() {} public void drawEchelon() {} public void drawDiamond() {} }
/** * created by xushilong on 2018/10/15. */ public class ShapeAdapter3 extends AbstractShape { @Override public void drawCircle() { System.out.println("圆形"); } @Override public void drawSquare() { System.out.println("正方形"); } }
以上是关于适配器模式的主要内容,如果未能解决你的问题,请参考以下文章