设计模式学习笔记(8)——适配器模式

版权声明:本文为博主原创,未经博主允许不得转载。 https://blog.csdn.net/weixin_36904568/article/details/89946984

1. 定义

把一个类的接口变换成客户端所期待的另一种接口,使原本因接口不匹配而无法在一起工作的两个类能够在一起工作

2. 使用

把适配的类的API转换成为目标类的API

(1)类适配——多重继承

  • 抽象目标(由于JAVA无法实现双重继承,此处为抽象接口)
  • 抽象被适配者
  • 适配器:继承目标+被适配器,转换具体被适配对象
  • 客户:通过目标接口,调用适配器的方法,发出适配请求,得到适配对象

特点:

  • 是静态的定义方式
  • 只能处理具体的被适配类
  • 适配器可以重新定义被适配类的部分行为,相当于子类覆盖父类的部分实现方法
  • 不需要重新实现整个被适配类,只需要实现需要转换的方法即可
目标
package AdapterPattern.ClassAdapter;

/**
 * 抽象目标
 */
public interface Target {

    //目标方法1
    public void operator1();

    //目标方法2
    public void operator2();
}

被适配者
package AdapterPattern.ClassAdapter;

/**
 * 被适配者
 */
public class Adaptee {

     //被适配的方法
    public void operator1(){
        System.out.println("被适配的方法");
    }
}

适配器
package AdapterPattern.ClassAdapter;

/**
 * 适配器
 */
public class Adapter extends Adaptee implements Target
{

    @Override
    public void operator2() {
        System.out.println("把被适配的方法映射为目标的方法2");
    }
}

测试
package AdapterPattern.ClassAdapter;

public class Test {
    public static void main(String[] args) {
        Target target = new Adapter();
        target.operator1();
        target.operator2();
    }
}


(2)对象适配——组合

  • 抽象目标接口
  • 抽象被适配者
  • 适配器:实现目标接口,转换具体被适配对象
  • 客户:通过目标接口,把具体被适配器对象通过适配器的方法,得到适配对象

特点:

  • 是动态组合的方式
  • 同一个适配器可以把类和它的子类都适配到目标接口
  • 需要定义被适配者的子类来实现重定义,然后让适配器组合子类
  • 需要重新实现整个被适配类
目标
package AdapterPattern.ObjectAdapter;

/**
 * 抽象目标
 */
public interface Target {

    //目标方法1
    public void operator1();

    //目标方法2
    public void operator2();
}

被适配者
package AdapterPattern.ObjectAdapter;

/**
 * 被适配者
 */
public class Adaptee {

    //被适配的方法1
    public void operator1(){
        System.out.println("被适配的方法1");
    }
}

适配器
package AdapterPattern.ObjectAdapter;


/**
 * 适配器
 */
public class Adapter implements Target
{
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee){
        this.adaptee = adaptee;
    }

    @Override
    public void operator1() {
        adaptee.operator1();
    }

    @Override
    public void operator2() {
        System.out.println("把被适配的方法映射为目标的方法");
    }
}

测试
package AdapterPattern.ObjectAdapter;


public class Test {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target target = new Adapter(adaptee);
        target.operator1();
        target.operator2();
    }
}

3. 特点

  • 在实现适配器功能的时候,可以调用自己开发的功能,自然地扩展系统的功能
  • 方便复用现有的类

4. 缺省适配

如果不准备实现一个接口的所有方法时,就可以使用“缺省适配模式”制造一个抽象类,给出所有方法的平庸的具体实现。

package AdapterPattern.DefaultAdapter;

/**
 * 公共接口
 */
public interface Service {

    public void operator1();

    public int operator2();

    public String operator3();
}

package AdapterPattern.DefaultAdapter;

public abstract class DefaultAdapter implements Service{
    @Override
    public void operator1() {

    }

    @Override
    public int operator2() {
        return 0;
    }

    @Override
    public String operator3() {
        return null;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_36904568/article/details/89946984