博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之适配器模式
阅读量:6991 次
发布时间:2019-06-27

本文共 1822 字,大约阅读时间需要 6 分钟。

  适配器模式就是把一个类的接口变换成客户端期望的接口,从而使因接口不匹配无法工作的两类可以在一起工作。

现实场景

  笔记本电源是三向电源插头,但是遇到了电源插座却是两向的,这是就需要一个适配器排插。

适配器模式设计的角色:

  • 源角色(Adaptee):现在需要适配的接口,如上面的两向电源插口;
  • 目标角色(Target):目标角色,也就是所期待得到的接口,如上面的笔记本的三向电源插头;
  • 适配器角色(Adapter):适配器类是本模式的核心。适配器把源接口转换成目标接口,显然,这一角色不可以是接口,而必须是具体类;如上面的排插。

适配器模式实现方法

  类适配器模式和对象适配器模式

类模式适配器

/** * Adaptee 源角色 如例子中的双向插口*/public class Adaptee {    public void charge(){        System.out.println("插入两向插头,给你充电了......");    }}
/** * Target 目标角色 如例子中的三向插口*/public interface Target {    void charge();}
/** * Adapter 对象适配器 如例子中的插排*/public class Adapter extends Adaptee implements Target{    @Override    public void charge() {        super.charge();    }}
/** * Client 客户端,如同例子中的 笔记本*/public class Client {    /**     * 充电     */    public void Test(Target target){        target.charge();    }    public static void main(String[] args) {        Client client = new Client();        Target target = new Adapter();        client.Test(target);    }}

对象适配器模式

/** * Adaptee 源角色 如例子中的双向插口*/public class Adaptee {    public void charge(){        System.out.println("插入两向插头,给你充电了......");    }}
/** * Target 目标角色 如例子中的三向插口*/public interface Target {    void charge();}
/** * ObjectAdapter 对象适配器 如例子中的排插*/public class ObjectAdapter implements Target {    private Adaptee adaptee;    @Override    public void charge() {        adaptee.charge();    }    public ObjectAdapter(Adaptee adaptee) {        super();        this.adaptee = adaptee;    }}
/** * Client 客户端,如同例子中的 笔记本*/public class Client {    /**     * 充电     */    public void Test(Target target){        target.charge();    }        public static void main(String[] args) {        Client client = new Client();        Adaptee adaptee = new Adaptee();        Target target2 = new ObjectAdapter(adaptee);        client.Test(target2);    }}

 建议尽量使用对象适配器的实现方式,多用合成/聚合、少用继承。

转载地址:http://dmbvl.baihongyu.com/

你可能感兴趣的文章
让 Markdown 中的代码可以实时运行
查看>>
spring和redis的整合
查看>>
Kubernetes为何如此炙手可热?
查看>>
详解:Git 常用基本命令使用方法一览
查看>>
Jose Mourinho: 任何成功都来自处心积虑
查看>>
Eclispe下集成JFinal中jetty包作为开发环境
查看>>
完全用Linux工作——看清华学子痛批Windows
查看>>
Spring Auto-Wiring Beans
查看>>
php不重新编译添加模块 php不重新编译添加模块
查看>>
jQuery过滤选择器:not()方法
查看>>
pietty自动登录
查看>>
输入n,求一个n×n矩阵,规定矩阵沿45度递增,形成zigzag数组
查看>>
FREEBSD上vsftp+MYSQL实现虚拟用户验证
查看>>
php.ini配置解释
查看>>
cordova与ios native code交互的原理
查看>>
vue tab组件
查看>>
使用supervisord管理swoole服务踩过的一个坑
查看>>
12种JavaScript MVC框架之比较
查看>>
开始学习 Backbone
查看>>
ant 执行 scp 命令
查看>>