第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

結(jié)合案例深入解析適配器模式(一)

標簽:
Java

一、基本概念

将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

可以将适配器理解为我们日常用的电脑充电器: 家庭电压为220V,而电脑充电频率是20V左右,所以需要适配。

二、结构

适配器可以分为两种: 对象适配器和类适配器。

对象适配器:


5d09eb1d0001ecbb04740118.jpg


从用户的角度看不到被适配者。

用户调用适配器转换出来的目标接口方法。适配器再调用被适配者的相关接口方法。

用户收到反馈结果,感觉只是和目标接口交互。

类适配器:

5d09eb1e00013b9d03390199.jpg

通过多重继承目标接口和被适配者类方式来实现适配。

三、案例

案例: 将火鸡冒充成鸭子。

1、对象适配器模式

逻辑图:


5d09eb1e0001aa4a07200344.jpg


代码组织结构图:


5d09eb1e0001d58702790169.jpg


被适配者火鸡Turkey:

public interface Turkey {
    void gobble(); // 火鸡叫声
    void fly();
}
/** 野火鸡 */
public class WildTurkey implements Turkey{
    @Override
    public void gobble() {
        System.out.println("Go Go!");
    }

    @Override
    public void fly() {
        System.out.println("I am Flying a short distance!");
    }
}

目标对象Duck:

/** 鸭子的接口 */
public interface Duck {
    void quack();//鸭子叫声
    void fly();
}

适配器TurkeyAdapter:

/**
 * 在外面表现是 鸭子(目标),但是实质是火鸡(被适配者)
 */
public class TurkeyAdapter implements Duck { //实现目标的接口

    private Turkey turkey; //这种对象型适配器必须要组合  被适配者,也就是要有适配者的引用

    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }

    // 实际是火鸡在叫
    @Override
    public void quack() {
        turkey.gobble();//外面表现是quack,但是内部是turkey.gobble()
    }

    @Override
    public void fly() {
        //由于火鸡飞的短,所以多飞几次,让火鸡更像鸭子
        for(int i = 0; i < 6; i++){
            turkey.fly();
        }
    }
}

测试:

public class MyTest {

    public static void main(String[] args) {
        WildTurkey turkey = new WildTurkey();
        Duck duck = new TurkeyAdapter(turkey);
        duck.quack(); //看似是鸭子,其实内置是火鸡
        duck.fly();
    }
}

输出:

Go Go!
I am Flying a short distance!
I am Flying a short distance!
I am Flying a short distance!
I am Flying a short distance!
I am Flying a short distance!
I am Flying a short distance!

2、类适配器模式

基本结构图:


5d09eb1e0001bcef07200346.jpg


虽然Java不支持多继承,但是可以实现的同时继承。

只有TurkeyAdapter有一些代码变动,其他不变:

/**
 * 和 对象适配器模式唯一的不同就是  : 适配器直接继承 被适配者 (而不是组合)
 */
public class TurkeyAdapter extends WildTurkey implements  Duck {

    @Override
    public void quack() {
        super.gobble(); //直接继承 被适配者
    }

    @Override
    public void fly() {
        //让火鸡飞6次,飞的像鸭子
        super.fly();
        super.fly();
        super.fly();
        super.fly();
        super.fly();
        super.fly();
    }
}

测试:

public class MyTest {

    public static void main(String[] args) {
        TurkeyAdapter duck = new TurkeyAdapter();//直接new即可
        duck.quack();
        duck.fly();
    }
}

输出和上面对象适配器一样。

3、Java中从以前枚举器Enumeration到迭代器Iterator的适配

EnumerationIterator适配的结构图:


5d09eb1f00014cac07200267.jpg


一个实例代码:(下面EnumerationIterator就是一个适配器)

/** 对象适配器的举例 java中的枚举到迭代器 */
public class EnumerationIterator implements Iterator<Object> {
    private Enumeration enumeration; //枚举 : 被适配者

    public EnumerationIterator(Enumeration enumeration) {
        this.enumeration = enumeration;
    }

    @Override
    public boolean hasNext() {
        return enumeration.hasMoreElements(); //实际调用的是 被适配者 的方法
    }

    @Override
    public Object next() {
        return enumeration.nextElement();
    }

    //这个可以说是适配器的缺点, 有些不能适配,比如两个插孔的插头不能适配为三个插孔的插头
    @Override
    public void remove() {
        throw new UnsupportedOperationException();
    }
}

四、总结

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


點擊查看更多內(nèi)容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
JAVA開發(fā)工程師
手記
粉絲
10
獲贊與收藏
90

關(guān)注作者,訂閱最新文章

閱讀免費教程

  • 推薦
  • 評論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學(xué)

大額優(yōu)惠券免費領(lǐng)

立即參與 放棄機會
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消