1. 程式人生 > >設計模式--適配器模式

設計模式--適配器模式

轉換 err tel 展示 urn sta 分享 n) 功能

代碼演示

鴨子接口:

package com.java.jikexueyuan.adaptermode.duck;

public interface Duck {
    public void quack();
    public void fly();
}

綠頭鴨實現鴨子接口;

package com.java.jikexueyuan.adaptermode.duck;

public class GreenHeadDuck implements Duck {

    @Override
    public void quack() {
        // TODO Auto-generated method stub
System.out.println(" Ga Ga"); } @Override public void fly() { // TODO Auto-generated method stub System.out.println("I am flying a long distance"); } }

火雞接口:

package com.java.jikexueyuan.adaptermode.turkey;

public interface Turkey {

    public void gobble();
    
public void fly(); }

火雞實現類:

package com.java.jikexueyuan.adaptermode.turkey;

public class WildTurkey implements Turkey {

    @Override
    public void gobble() {
        // TODO Auto-generated method stub
        System.out.println(" Go Go");
    }

    @Override
    public void fly() {
        // TODO Auto-generated method stub
System.out.println("I am flying a short distance"); } }

適配器對外展示的是鴨子的形式,所以實現鴨子的接口

package com.java.jikexueyuan.adaptermode.adapter;

import com.java.jikexueyuan.adaptermode.duck.Duck;
import com.java.jikexueyuan.adaptermode.turkey.Turkey;

public class TurkeyAdapter implements Duck {
    private Turkey turkey;
    
    public TurkeyAdapter(Turkey turkey)
    {
        this.turkey=turkey;
    }

    @Override
    public void quack() {
        // TODO Auto-generated method stub
        turkey.gobble();
    }

    @Override
    public void fly() {
        // TODO Auto-generated method stub
        for(int i=0;i<6;i++)
        {
            turkey.fly();  //模擬鴨子飛的遠
        }
    }

}

適配器模式:將一個類的接口轉換成另一種接口.讓原本接口不兼容的類可以兼容

技術分享圖片

從用戶的角度看不到被適配者,是解耦的

用戶調用適配器轉化出來的目標接口方法

適配器再調用被適配者的相關接口方法

用戶收到反饋結果,感覺只是和目標接口交互

對象適配器與類適配器

類適配器:通過多重繼承目標接口和被適配者類方式來實現適配

技術分享圖片

多重繼承,其中繼承的目標接口部分達到適配目的,而繼承被適配者類的部分達到通過調用被適配者類裏的方法來實現目標接口的功能

對象適配器與類適配器差異

技術分享圖片

對象適配器和類適配器使用了不同的方法實現適配,對象適配器使用組合,類適配器使用繼承.

使用類適配器重新實現上邊的例子:

適配器:

package com.java.jikexueyuan.adaptermode.adapter;

import com.java.jikexueyuan.adaptermode.duck.Duck;
import com.java.jikexueyuan.adaptermode.turkey.WildTurkey;

public class TurkeyAdapter2 extends WildTurkey implements Duck {

    @Override
    public void quack() {
        // TODO Auto-generated method stub
        super.gobble();
    }
    @Override
    public void fly() {
        // TODO Auto-generated method stub
        super.fly();
        super.fly();
        super.fly();
    }
}

實例:從枚舉器到叠代器的適配

package com.java.jikexueyuan.adaptermode.adapter;

import java.util.Enumeration;
import java.util.Iterator;

public class EnumerationIterator implements Iterator<Object> {

    private Enumeration enumeration;
    
    public EnumerationIterator(Enumeration enumeration)
    {
         this.enumeration= enumeration;
    }
    
    @Override
    public boolean hasNext() {
        // TODO Auto-generated method stub
        return enumeration.hasMoreElements();
    }

    @Override
    public Object next() {
        // TODO Auto-generated method stub
        return enumeration.nextElement();
    }

    @Override
    public void remove() {
        // TODO Auto-generated method stub
        throw new UnsupportedOperationException();
    }

}

設計模式--適配器模式