Java設計模式(7)----------橋接模式

disable發表於2021-09-09
1、介紹

橋接模式是一種結構型的設計模式,主要是特點是將抽象部分與實現部分分離開來,從而能夠進行獨自的變化。在橋接模式中,所謂的橋,個人理解是在抽象層中,將介面聯絡到一個抽象類中,更確切的說,是依賴關係。橋接模式主要適用場景是,某個物件需要從兩個或者多個(一般是兩個)維度進行描述或者操作的時候,能夠簡潔的進行處理。

特點:抽象與實現分離。抽象層依賴,具有非常好的擴充套件性。

適用場景:當場景中某個事物需要從兩個或者多個維度進行描述或者操作。

2、案例
2.1、情景

舉一個在飯店(抽象類)吃飯(動作介面)的例子。我們可以選擇在香格里拉(具體類)吃飯,也可以在希爾頓(具體類)吃飯。兩個酒店都可以提供烤肉(吃烤肉,動作介面實現類)和沙拉(吃沙拉,動作介面實現類)。我們的操作或者描述的問題,就是在什麼酒店吃什麼的問題。很顯然,這是一個2維度的選擇組合的動作,那麼就可以透過橋接模式的思路來進行實現。

對應的UML類圖如下:

圖片描述

2.2、實現

1)吃飯介面

public interface EatFood
{
    String eat();
}

2)吃飯實現類

public class EatMeat implements EatFood
{
    @Override
    public String eat()
    {
        return "烤肉";
    }
}
public class EatSalad implements EatFood
{
    @Override
    public String eat()
    {
        return "沙拉";
    }
}

3)餐廳抽象類

public abstract class Restaurant
{
    protected EatFood eatFood;

    public Restaurant(EatFood eatFood)
    {
        this.eatFood = eatFood;
    }
    public abstract String action();
}

4)餐廳實體類

public class ShangriLa extends Restaurant
{
    public ShangriLa(EatFood eatFood)
    {
        super(eatFood);
    }

    @Override
    public String action()
    {
        return "在香格里拉酒店吃" + eatFood.eat();
    }
}
public class Healton extends Restaurant
{
    public Healton(EatFood eatFood)
    {
        super(eatFood);
    }

    @Override
    public String action()
    {
        return "在希爾頓酒店吃" + eatFood.eat();
    }
}

5)驗證程式

/**
 * 驗證
 */
public class Demo
{
    public static void main(String[] args)
    {
        Restaurant restaurant = new ShangriLa(new EatMeat());
        System.out.println(restaurant.action());

        Restaurant restaurant1 = new Healton(new EatSalad());
        System.out.println(restaurant1.action());
    }
}

6)執行結果

在香格里拉酒店吃烤肉
在希爾頓酒店吃沙拉

Process finished with exit code 0

3、總結
3.1、與抽象工廠的異同

上文講到,橋接模式的適用場景是需要從兩個或者多個維度去描述或者操作事物。而抽象工廠模式也與“多個維度”相關。這兩種模式的適用場景都是涉及多維度的。但是是存在區別的,抽象工廠模式更關注物件的建立,是建立型設計模式。而橋接模式則是關注物件建立之後的動作或者功能。所以兩者的區別是比較明顯的。

3.2、橋接模式特點

橋接模式的特點是將抽象與實現分離,在抽象層建立依賴關係,從而兩個維度上的實現類可以進行各自的變化不會相互影響,具有非常好的擴充套件性。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/200/viewspace-2799751/,如需轉載,請註明出處,否則將追究法律責任。

相關文章