—-慢慢来比较快,虚心学技术—-

概念

将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作

类比我们手机的充电器,原本充电线的头无法直接连接到插座孔,加上充电头(适配器)后就可以连接了。

角色:

目标接口:当前需求所期待的接口

适配者类:现有的类,就是被适配和被访问的类

适配器类:一个转换器,通过继承或引用适配者的对象,把适配者的接口转换成目标接口,让客户端通过目标接口访问适配者类

推演

需求**:调用类方法计算两个值的和**

  1. /**
  2. * 计算类
  3. */
  4. class Calculator{
  5. public int add(int a,int b){
  6. return a+b;
  7. }
  8. }

调用:

  1. Calculator calculator = new Calculator();
  2. int sum = calculator.add(1, 2);
  3. System.out.println(sum);

此时,如果需要计算三个数的和,add(int a,int b)方法是无法满足的。

反例

在不改变原有Calculator类的前提下让add能够接收3个参数并计算和,我们可以直接继承该类并调用父类的add方法实现

  1. class MyCaculator extends Calculator{
  2. public int add(int a,int b,int c){
  3. return super.add(a, super.add(b, c));
  4. }
  5. }

此时调用如下:

  1. Calculator calculator = new MyCaculator();
  2. int sum = calculator.add(1, 2,3);
  3. System.out.println(sum);

效果达到,问题是,如果并不了解父类细节,而父类中存在同名的方法比如:

  1. public int add(int a,int b,int c) {
  2. return a*b+c;
  3. }

则会导致继承逻辑问题

正例

组合优于继承,我们关联MyCaculator 和Caculator类,而不是继承

  1. class MyCaculator{
  2. private Calculator calculator;
  3. public MyCaculator(Calculator calculator){
  4. this.calculator = calculator;
  5. }
  6. public int add(int a,int b,int c){
  7. return calculator.add(a, calculator.add(b, c));
  8. }
  9. }

而此时调用如下:

  1. Calculator calculator = new Calculator();
  2. MyCaculator myCaculator = new MyCaculator(calculator);
  3. int sum = myCaculator.add(1, 2,3);
  4. System.out.println(sum);

上述场景中,add(int a,int b,int c)是目标接口,Calculator是适配者,MyCaculator是适配器

应用场景

使用第三方提供的组件接口,但其组件接口与自己要求的接口不一致

优点

复用现存的类的同时扩展原有功能,而不需要修改源代码,符合开闭原则

不必担心耦合继承问题

如有贻误,还请评论指正