设计模式(七)—— 适配器模式

一、含义

将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间,也就是说适配器模式是在原有一个类的基础上,在不改变这个类的代码时,新建一个类将其原来的类,进行封装改变,以符合新的需求。

二、要点

1.当需要使用一个现有的类而其接口并不符合你的需要时,就使用适配器。

2.适配器模式有两种形式:对象适配器和类适配器。类适配器需要用到多重继承来实现,所以在java中只能实现对象适配器,java不支持多重继承。

3.实现一个适配器的复杂程度,是根据在要实现的目标接口的大小和复杂度而定的。

三、实战分析适配器模式

首先来看一下适配器模式的类图:

我们看看一个古话,叫做挂羊头卖狗肉,其实就可以用适配器模式来实现,首先我们需要实例一个通用的羊的接口和一个具体的羊的实现类

//这是一个羊的接口
public interface Sheep {

    //羊肉的味道
    public void taste();

    //羊的外观
    public void appearance();
}
//一个羊的具体实现类
public class Goat implements Sheep {
    
    @Override
    public void taste() {
        System.out.println("我的味道很鲜美");
    }

    @Override
    public void appearance() {
        System.out.println("我有一对羊角");
    }
}

然后就是实例一个狗的接口和一个具体的类


//这个一个狗的实例
public interface Dog {

    //狗肉的味道
    public void taste();

    //狗的外观
    public void appearance();
}
//这是一个具体的狗的实体
public class RuralDog implements Dog {
    
    @Override
    public void taste() {
        System.out.println("狗肉的味道");
    }

    @Override
    public void appearance() {
        System.out.println("狗头狗脑的");
    }
}

因为羊肉的价格贵一点,所以就用狗肉去充当羊肉去卖,这个时候就需要一个适配器,将狗肉转换成羊肉去买,适配的代码如下:

//适配器需要实现目标接口,也就是羊的接口
public class DogAdapte implements Sheep {
    
    //需要一个被转化的对象,也就是一条狗的实例
    Dog dog;

    public DogAdapte(Dog dog) {
        this.dog = dog;
    }

    @Override
    public void taste() {
        dog.taste();
    }

    @Override
    public void appearance() {
        dog.appearance();
    }
}

最后编写代码来测试一下:

public class SheepTest {

    public static void main(String[] args) {
        Goat goat = new Goat();
        RuralDog ruralDog = new RuralDog();
        
        Sheep dogAdapte = new DogAdapte(ruralDog);

        System.out.println("DogAdapte says:");
        testSheep(dogAdapte);
        
    }
    
    static void testSheep(Sheep sheep) {
        sheep.taste();
        sheep.appearance();
    }
}

测试结果如下:

DogAdapte says:
狗肉的味道
狗头狗脑的

调用的是狗的味道,但返回给客户是一个羊的对象,这就是挂羊头卖狗肉,看着是个羊,买的其实是狗肉。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值