Java 设计模式(7) —— 适配器模式

一、适配器模式

将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容

适配器模式

二、示例

1.显示生活中适配器的例子

生活中的适配器:充电器转接头,假如买了一个港版或者美版的手机,但是自带的充电器在国内是不能用的,因此需要在自带的充电头上再接一个转接头,这样就可以在国内的插排上使用。那么这个转接头就属于充电头的适配器。

2.项目模拟:一只火鸡不小心混进的鸭群当中,为了不让它被发现,必须对鸭子的行为进行适配

1).定义鸭子的通用方法

/**
 * 鸭子对象实现的接口方法
 */
public interface Duck {
    public void quack();
    public void fly();
}

2).定义鸭子种类

/**
 * 绿头鸭
 */
public class GreenHeadDuck implements Duck {
    /**
     * 鸭子是 ga ga 叫
     */
    @Override
    public void quack() {
        System.out.println(" Ga Ga");
    }
    @Override
    public void fly() {
        System.out.println("I am flying a long distance");
    }
}

3).定义火鸡通用的接口方法

/**
 * 火鸡对象实现的接口方法
 */
public interface Turkey {
    public void gobble();
    public void fly();
}

4).定义火鸡种类

/**
 * 火鸡
 */
public class WildTurkey implements Turkey {
    /**
     * 火鸡是go go 叫
     */
    @Override
    public void gobble() {
        System.out.println(" Go Go");
    }
    @Override
    public void fly() {
        System.out.println("I am flying a short distance");
    }
}

5).火鸡对鸭子进行适配,模仿鸭子的行为方法


/**
 * 适配器模式,对象适配器
 */
public class TurkeyAdapter implements Duck {
    private Turkey turkey;
    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }
    /**
     * 实现鸭子的叫声方法
     */
    @Override
    public void quack() {
        turkey.gobble();
    }
    /**
     * 实现鸭子的飞行方法
     */
    @Override
    public void fly() {
        for (int i = 0; i < 6; i++) {
            turkey.fly();
        }
    }
}

6).通过适配器,则这只火鸡就可以模仿鸭子的行为变成一只鸭子

/**
 * 适配器模式,一个对象适配成为另外一个对象,并实现其原有定义的方法
 */
public class MainTest {
    public static void main(String[] args) {
        GreenHeadDuck duck=new GreenHeadDuck();
        WildTurkey turkey=new WildTurkey();
        Duck duck2turkeyAdapter=new TurkeyAdapter2();
        turkey.gobble();
        turkey.fly();
        duck.quack();
        duck.fly();
        // 通过适配器转换后的火鸡变成了一直鸭子
        duck2turkeyAdapter.quack();
        duck2turkeyAdapter.fly();
    }
}

三、类适配器

  • 适配器分为:
    • 对象适配器
    • 类适配器
  • 以上例子中的适配器实现方式为对象适配器,即在适配器中定义对象的方式进行适配
  • 类适配器:通过多重继承目标接口和被适配者类方式来实现适配。其中继承的目标接口部分达到适配目的,而继承被适配者类的部分达到通过调用被适配者类里的方法来实现目标接口的功能
/**
 * 适配器模式,类适配器
 */
public class TurkeyAdapter2 extends WildTurkey implements Duck {
    @Override
    public void quack() {
        super.gobble();
    }
    @Override
    public void fly() {
        super.fly();
        super.fly();
        super.fly();
    }
}

  • 对象适配器和类适配器使用了不同的方法实现适配,对象适配器使用组合,类适 配器使用继承

四、总结

  • 1.从用户的角度看不到被适配者,是解耦的

  • 2.用户直接调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法

  • 3.适配器实现了用户收到反馈结果,感觉只是和目标接口交互

Java设计模式所有示例代码,持续更新中