1. 程式人生 > >Headfirst java設計模式-介面卡模式

Headfirst java設計模式-介面卡模式

介面卡模式:將一個類的介面,轉換為客戶期望的另一個類的介面。介面卡讓原本不相容的類可以合作無間。
介面卡分為兩種:
1.物件介面卡:採用組合的方式,將請求傳送給被適配者。
2.類介面卡:繼承被適配者和目標類。

介面卡和外觀模式都可以針對多個類,他們的區別在於意圖不同,介面卡的意圖在於改變介面符合客戶需要,而外觀模式的意圖是提供子系統的一個簡化介面。

1.物件介面卡:採用組合的方式,將請求傳送給被適配者。
相關程式碼:
(1)先定義兩個介面:

public interface Duck {
    public void Quack();
    public void fly
(); } public interface Turkey { public void gobble(); public void fly(); }

(2)根據兩個介面分別實現兩個類

public class MallardDuck implements Duck{

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

    @Override
    public void
fly() { // TODO Auto-generated method stub System.out.println("I'm flying"); } } public class WildTurkey implements Turkey { @Override public void gobble() { // TODO Auto-generated method stub System.out.println("Gooble gooble"); } @Override public
void fly() { // TODO Auto-generated method stub System.out.println("I'm flying a short distance."); } }

(3)建立一個TurkeyAdapter將繼承duck介面將turkey適配為Duck。

public class TurkeyAdapter implements Duck {

    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 < 5; i++)
            turkey.fly();
    }
}

(4)測試

public class DuckTestDrive {
    public static void main(String args[]){
        MallardDuck duck = new MallardDuck();

        WildTurkey turkey = new WildTurkey();
        Duck turkeyAdapter = new TurkeyAdapter(turkey);

        System.out.println("The Turkey says......");
        turkey.gobble();
        turkey.fly();

        System.out.println("The Duck days......");
        testDuck(duck);

        System.out.println("The TurkeyAdapter says......");
        testDuck(turkeyAdapter);

    }

static void testDuck(Duck duck)
{
    duck.Quack();
    duck.fly();
}
}

測試結果:
The Turkey says……
Gooble gooble
I’m flying a short distance.
The Duck days……
Quark
I’m flying
The TurkeyAdapter says……
Gooble gooble
I’m flying a short distance.
I’m flying a short distance.
I’m flying a short distance.
I’m flying a short distance.
I’m flying a short distance.

2.類介面卡:繼承被適配者和目標類。
由於java無法多重繼承,所以無法實現。與物件介面卡繼承目標類並採用組合的方式將請求傳遞給被適配者不同,類介面卡同時繼承適配者和目標類。