天天看點

給女友講講設計模式——擴充卡模式(JAVA執行個體)5

前言

有這樣一個人,看到别人一個個開餐館賺了好多錢,于是自己也很想在餐飲業這方面大展拳腳,他從别人那裡學到了他們的理念,還學習到了他們真正開店的經驗。不但如此,他還引進了除了吃飯意外其他的服務,例如說提供了本該是酒吧才有的歌手駐場來提供好的就餐氛圍這樣的服務。正因為如此,生意做得生龍活虎。

正文

說起擴充卡模式,主要可以分為三種 : “類适配” ,“對象适配” ,“接口适配”。類适配與對象适配及其相似,接口适配相對有些出入。

下面就代碼進行講解一下。

package adapter;

public interface Restaurant {
    public void haveFood();
    public void haveDrink();
}

           

這是一個餐廳的接口,有食物,也有飲料。

package adapter;

public class RestaurantImpl implements Restaurant{

    @Override
    public void haveFood() {
        System.out.println("提供各種美食");
        
    }

    @Override
    public void haveDrink() {
        System.out.println("提供各種飲料");
        
    }

}

           

我們是實作了這個接口,讓他有具體的實際意義。

package adapter;

public interface Bar {
    public void haveSong();
}

           

酒吧接口,提供了一個唱歌駐唱的服務。

package adapter;

public class MyRestaurantAdapter extends RestaurantImpl implements Bar{

    @Override
    public void haveSong() {
        System.out.println("在餐廳同樣提供酒吧的駐唱服務");
    }

}

           

用擴充卡建立我們自己的餐廳,這樣我們既有食物,飲料,還有了酒吧所具有的駐唱功能。

package adapter;

public class MainTest {
    
    public static void main(String[] args) {
        MyRestaurantAdapter adapter = new MyRestaurantAdapter();
        adapter.haveFood();
        adapter.haveDrink();
        adapter.haveSong();
    }
}

           

調用一下自己創造的餐廳。

下面是對象擴充卡,在擴充卡中,把自己想要繼承的方法,定義為一個變量,然後以構造函數的函數,注入進去,和剛剛類擴充卡大同小異。

package adapter;

public class MyRestaurantAdapter2 implements Bar{

    private Restaurant restaurant;
    public MyRestaurantAdapter2(Restaurant restaurant) {
        this.restaurant = restaurant;
        this.restaurant.haveFood();
        this.restaurant.haveDrink();
    }
    @Override
    public void haveSong() {
        System.out.println("餐廳同樣可以有酒吧的相關駐唱服務");
    }

}

           
package adapter;

public class MainTest {
    
    public static void main(String[] args) {
        
        MyRestaurantAdapter2 adapter2 = new MyRestaurantAdapter2(new RestaurantImpl());
        adapter2.haveSong();
    }
}
           

下面介紹一下接口擴充卡,使用接口擴充卡主要的原因是這樣的,在一個接口中有很多方法的時候,我們想要實作它,必須得把所有的他的方法都放在自己的類中,雖然是一些空方法,不用具體的實作,但是看起來也是特别讓人感覺到火大的,是以我們用了一個抽象類作為了一個擴充卡,下面來看代碼。

package adapter;

public interface BestRestaurant {

    public void havebeef();
    
    public void haveIceCream();
    
    public void haveRedWine();
    
    public void havePizza();
    
    public void haveGooseLiver();
}

           

這是一個最棒的餐廳,有着各種各樣的豐富料理。

package adapter;

public abstract class BestRestaurantAdapter implements BestRestaurant {

    public void havebeef() {
    };

    public void haveIceCream() {
    };

    public void haveRedWine() {
    };

    public void havePizza() {
    };

    public void haveGooseLiver() {
    };
}

           

通過抽象類作為一個擴充卡,實作最好的餐廳接口。

package adapter;

public class BestResaurantMy extends BestRestaurantAdapter{


    @Override
    public void havebeef() {
        System.out.println("這裡有牛肉");
    }
    
    @Override
    public void haveRedWine() {
        System.out.println("這裡有紅酒");
    }
    

}

           

繼承一下剛剛的抽象類,這樣我們隻需要實作自己想要的方法就可以了。不必再把那些沒用的空方法一并放進來。

package adapter;

public class Client {
    
    public static void main(String[] args) {
        BestRestaurant br =new BestResaurantMy();
        br.havebeef();
        br.haveRedWine();
    }

}

           

最後調用一下就大功告成了。

後記

最近公司實在是太忙,因為項目快要上線了,是以一直就耽擱沒有進行更新,現在生物鐘又回到正軌上了,要繼續拿起書本不斷進步學習,生命不息,學習不止。