• <menu id="gyiem"><menu id="gyiem"></menu></menu>
  • <menu id="gyiem"><code id="gyiem"></code></menu>

    Java設計模式(八) 適配器模式

    原創文章,轉載請務必將下面這段話置于文章開頭處(保留超鏈接)。
    本文轉發自技術世界原文鏈接 http://www.luozeyang.com/design_pattern/adapter/

    適配器模式介紹

    適配器模式定義

    適配器模式(Adapter Pattern),將一個類的接口轉換成客戶希望的另外一個接口。適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。

    適配器模式類圖

    適配器模式類圖如下
    Adapter pattern class diagram

    適配器模式角色劃分

    • 目標接口,如上圖中的ITarget
    • 具體目標實現,如ConcreteTarget
    • 適配器,Adapter
    • 待適配類,Adaptee

    實例解析

    本文代碼可從作者Github下載

    目標接口

    1
    2
    3
    4
    5
    6
    7
    package com.jasongj.target;

    public interface ITarget {

    void request();

    }

    目標接口實現

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package com.jasongj.target;

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;


    public class ConcreteTarget implements ITarget {

    private static Logger LOG = LoggerFactory.getLogger(ConcreteTarget.class);

    @Override
    public void request() {
    LOG.info("ConcreteTarget.request()");
    }

    }

    待適配類,其接口名為onRequest,而非目標接口request

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package com.jasongj.adaptee;

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    import com.jasongj.target.ConcreteTarget;

    public class Adaptee {

    private static Logger LOGGER = LoggerFactory.getLogger(ConcreteTarget.class);

    public void onRequest() {
    LOGGER.info("Adaptee.onRequest()");
    }

    }

    適配器類

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package com.jasongj.target;

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    import com.jasongj.adaptee.Adaptee;

    public class Adapter implements ITarget {

    private static Logger LOG = LoggerFactory.getLogger(Adapter.class);

    private Adaptee adaptee = new Adaptee();

    @Override
    public void request() {
    LOG.info("Adapter.request");
    adaptee.onRequest();
    }

    }

    從上面代碼可看出,適配器類實際上是目標接口的類,因為持有待適配類的實例,所以可以在適配器類的目標接口被調用時,調用待適配對象的接口,而客戶端并不需要知道二者接口的不同。通過這種方式,客戶端可以使用統一的接口使用不同接口的類。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    package com.jasongj.client;

    import com.jasongj.target.Adapter;
    import com.jasongj.target.ConcreteTarget;
    import com.jasongj.target.ITarget;

    public class AdapterClient {

    public static void main(String[] args) {
    ITarget adapter = new Adapter();
    adapter.request();

    ITarget target = new ConcreteTarget();
    target.request();
    }

    }

    適配器模式適用場景

    • 調用雙方接口不一致且都不容易修改時,可以使用適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作
    • 多個組件功能類似,但接口不統一且可能會經常切換時,可使用適配器模式,使得客戶端可以以統一的接口使用它們

    適配器模式優缺點

    適配器模式優點

    • 客戶端可以以統一的方式使用ConcreteTarget和Adaptee
    • 適配器負責適配過程,而不需要修改待適配類,其它直接依賴于待適配類的調用方不受適配過程的影響
    • 可以為不同的目標接口實現不同的適配器,而不需要修改待適配類,符合開放-關閉原則

    適配器模式與OOP原則

    已遵循的原則

    • 依賴倒置原則
    • 迪米特法則
    • 里氏替換原則
    • 接口隔離原則
    • 單一職責原則
    • 開閉原則

    未遵循的原則

    • NA

    Java設計模式系列

    郭俊 Jason wechat
    歡迎關注作者微信公眾號【大數據架構】
    您的贊賞將支持作者繼續原創分享
    速赢彩app 泗洪 | 湖南长沙 | 宁国 | 泉州 | 江门 | 钦州 | 基隆 | 廊坊 | 江门 | 泗阳 | 果洛 | 宝应县 | 邵阳 | 西双版纳 | 神木 | 六盘水 | 台州 | 如皋 | 东阳 | 新疆乌鲁木齐 | 遂宁 | 黄南 | 昆山 | 海门 | 永新 | 玉树 | 喀什 | 单县 | 抚顺 | 扬中 | 巴彦淖尔市 | 灌南 | 肥城 | 九江 | 公主岭 | 贵州贵阳 | 温岭 | 正定 | 文昌 | 随州 | 临海 | 东台 | 肇庆 | 漳州 | 贵州贵阳 | 巴彦淖尔市 | 醴陵 | 潜江 | 眉山 | 鹤岗 | 咸宁 | 达州 | 安徽合肥 | 长垣 | 湖州 | 肇庆 | 琼中 | 招远 | 泰兴 | 黑龙江哈尔滨 | 定安 | 山南 | 陕西西安 | 周口 | 日土 | 济南 | 宝应县 | 海西 | 焦作 | 陵水 | 阿拉尔 | 襄阳 | 宁德 | 海北 | 山东青岛 | 五家渠 | 定州 | 石狮 | 文山 | 贺州 | 鹤壁 | 安徽合肥 | 遵义 | 吴忠 | 淮北 | 天水 | 象山 | 桐城 | 十堰 | 汉川 | 朝阳 | 铜陵 | 安康 | 内江 | 鄢陵 | 高密 | 台南 | 晋中 | 莒县 | 常州 | 桐城 | 宜昌 | 眉山 | 灌南 | 湖州 | 孝感 | 枣庄 | 仙桃 | 肇庆 | 运城 | 蚌埠 | 张家口 | 通辽 |