—-慢慢来比较快,虚心学技术—-
概念
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作
类比我们手机的充电器,原本充电线的头无法直接连接到插座孔,加上充电头(适配器)后就可以连接了。
角色:
目标接口:当前需求所期待的接口
适配者类:现有的类,就是被适配和被访问的类
适配器类:一个转换器,通过继承或引用适配者的对象,把适配者的接口转换成目标接口,让客户端通过目标接口访问适配者类
推演
需求**:调用类方法计算两个值的和**
/*** 计算类*/class Calculator{public int add(int a,int b){return a+b;}}
调用:
Calculator calculator = new Calculator();int sum = calculator.add(1, 2);System.out.println(sum);
此时,如果需要计算三个数的和,add(int a,int b)方法是无法满足的。
反例
在不改变原有Calculator类的前提下让add能够接收3个参数并计算和,我们可以直接继承该类并调用父类的add方法实现
class MyCaculator extends Calculator{public int add(int a,int b,int c){return super.add(a, super.add(b, c));}}
此时调用如下:
Calculator calculator = new MyCaculator();int sum = calculator.add(1, 2,3);System.out.println(sum);
效果达到,问题是,如果并不了解父类细节,而父类中存在同名的方法比如:
public int add(int a,int b,int c) {return a*b+c;}
则会导致继承逻辑问题
正例
组合优于继承,我们关联MyCaculator 和Caculator类,而不是继承
class MyCaculator{private Calculator calculator;public MyCaculator(Calculator calculator){this.calculator = calculator;}public int add(int a,int b,int c){return calculator.add(a, calculator.add(b, c));}}
而此时调用如下:
Calculator calculator = new Calculator();MyCaculator myCaculator = new MyCaculator(calculator);int sum = myCaculator.add(1, 2,3);System.out.println(sum);
上述场景中,add(int a,int b,int c)是目标接口,Calculator是适配者,MyCaculator是适配器
应用场景
使用第三方提供的组件接口,但其组件接口与自己要求的接口不一致
优点
复用现存的类的同时扩展原有功能,而不需要修改源代码,符合开闭原则
不必担心耦合继承问题
如有贻误,还请评论指正
