设计模式(四)适配器模式(Adapter)

转载请标明出处:
http://blog.csdn.net/qq_34707744/article/details/79196911

本文出自:【生平少年】

维基百科

在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。

我的理解:2017年新出的macbook pro为例,没有usb接口,而我如果向把我的U盘连接我我的mac,需要花几百块钱买一个转换器。此时,macbook pro上的 usb-c 接口就是我们需要适配的类、接口或者对象,简称 src(source),最终转换的USB接口就是我们需要的输出,简称 dst (destination,即Target)。那么,这个转换器就是一个适配器(Adapter)。

结构

对象适配器模式

适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。

类适配器模式

这种适配器模式下,适配器继承自已实现的类(一般多重继承。

接口的适配器模式(缺省适配器模式)

当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求,它适用于一个接口不想使用其所有的方法的情况。


以 macbook Pro 接口为例:

src 类(macbook pro的 usb-c 接口):

//macbook pro 上的 usb-c 接口
class MacBookProUSBC {
    public String usbc() {
        String src = "usb-c";
        System.out.println("我是" + src + "接口");
        return src;
    }
}

dst接口(我所需要的输出)

//dst接口(U盘的usb接口)
interface UpanUSB {
    String usb();
}

客户端(我的U盘)

//Client类(我的U盘)
class Upan {
    //转换接口
    public void charging(UpanUSB upanUSB) {
        if (upanUSB.usb() == "USB") {
            System.out.println("接口是USB接口,开始传输数据");
        } else {
            System.out.println("接口不是USB接口,无法传输数据");
        }
    }
}

类适配器模式

通过继承来实现适配器功能。
即,Adapter类通过继承 src 类,实现 dst 类接口,完成 src 到 dst 的适配。

类适配器

//我买的转换器,先继承 src类即MacbookPro,用来实现输出dst类即U盘接口
class ClassAdapter extends MacBookProUSBC implements UpanUSB {
    @Override
    public String usb() {
        String src = usbc();
        System.out.println("适配器开始转换接口");
        String dst = "";
        // ...... 开始业务逻辑
        dst = "USB";
        System.out.println("适配器开始转换后的接口" + dst);
        return dst;
    }
}

测试

 System.out.println("===============类适配器==============");
 UPan upan = new UPan();
 upan.charging(new ClassAdapter());

对象适配器模式(常用)

通过组合来实现适配器功能。
即,持有 src 类,实现 dst 类接口,完成 src 到 dst 的适配。

对象适配器

class ObjectAdapter implements UpanUSB {
    private MacBookProUSBC myMacBookProUSBC;

    public ObjectAdapter(MacBookProUSBC macBookProUSBC) {
        myMacBookProUSBC = macBookProUSBC;
    }
    @Override
    public String usb() {
        String dst = "";
        if (null != myMacBookProUSBC) {
            String src = myMacBookProUSBC.usbc();
            System.out.println("适配器开始转换接口");

            // ...... 开始业务逻辑
            dst = "USB";
            System.out.println("适配器开始转换后的接口" + dst);
        }
        return dst;
    }
}

测试

//对象适配器
System.out.println("\n===============对象适配器==============");
ObjectAdapter objectAdapter = new ObjectAdapter(new MacBookProUSBC());
Upan upan = new Upan();
upan.charging(objectAdapter);

比较

内容类适配器模式对象适配器模式
原理通过继承来实现适配器功能通过组合来实现适配器功能
优点重写src类,Adapter更灵活成本更低,更灵活
缺点dst必须是接口,有一定局限性逻辑复杂
使用场景1.需要间接访问不符合现有接口规范的类中的方法。2.适配其他没有提供合适接口的类,可被多处访问)同左
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@SokachWang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值