設計模式->建造者

建造模式

建造模式介紹

建造模式的核心就是不同對象的組合

類間關係

在這裏插入圖片描述

代碼實現

食物接口

public interface IFood {
    void eat();//吃
    double getPrice();//獲得價格
    FoodEnum getFoodType();//獲得食物類型,便於後面強轉
}

甜品接口

public interface IDessert extends IFood{
    void look();
}

飲品接口

public interface IDrink extends IFood {
    void touch();//飲品要先用手感受一下
}

肉接口

public interface IMeat extends IFood {
    /**
     * 肉要先聞一下香不香
     */
    void smell();
}

素食接口

public interface IVegetarian extends IFood {
    /**
     * 感受素食的快樂
     */
    void feeling();
}

定義食物類型枚舉

public enum FoodEnum {
    DRINK,DESSERT,MEAT,VEGETARIAN
}

創建一個冰淇淋對象

public class IceCream implements IDessert {
    @Override
    public void eat() {
        System.out.println("冰淇淋,好吃");
    }

    @Override
    public double getPrice() {
        return 5D;
    }

    @Override
    public FoodEnum getFoodType() {
        return FoodEnum.DESSERT;
    }

    @Override
    public void look() {
        System.out.println("這冰淇淋,簡直就是一件藝術品,開始吃了");
    }
}

定義漢堡對象

public class Hamburg implements IMeat {
    @Override
    public void eat() {
        System.out.println("雙層漢堡,真香~~~");
    }

    @Override
    public double getPrice() {
        return 15D;
    }

    @Override
    public FoodEnum getFoodType() {
        return FoodEnum.MEAT;
    }

    @Override
    public void smell() {
        System.out.println("這漢堡,羊肉味兒+驢肉味兒,迫不及待了");
    }
}

定義餃子

public class Dumplings implements IMeat {
    @Override
    public void eat() {
        System.out.println("吃餃子,沒想到吧,這裏也有餃子");
    }

    @Override
    public double getPrice() {
        return 10D;
    }

    @Override
    public FoodEnum getFoodType() {
        return FoodEnum.MEAT;
    }

    @Override
    public void smell() {
        System.out.println("這餃子,真香,我開始吃了");
    }
}

定義可樂

public class CocaCola implements IDrink {
    @Override
    public void eat() {
        System.out.println("咕嚕咕嚕~~~");
    }

    @Override
    public double getPrice() {
        return 4D;
    }

    @Override
    public FoodEnum getFoodType() {
        return FoodEnum.DRINK;
    }

    @Override
    public void touch() {
        System.out.println("剛纔摸了一下,有點冰啊");
    }
}

然後就是開始調用

public class Content {
    public static void main(String[] args) {
        PackageSelection packageSelection =new PackageSelection();
        Double checkout = packageSelection.addFood(new IceCream()).addFood(new Hamburg()).addFood(new CocaCola()).checkout();
        System.out.println("結賬嘍:---> "+checkout);

        List<IFood> iFoods = packageSelection.takeFood();
        for(IFood food:iFoods){
            //接下來判斷食物類型
            switch (food.getFoodType()){
                case MEAT:{
                    //肉要先聞一下香不香,香就是好肉
                    ((IMeat)food).smell();
                    food.eat();
                    break;
                }
                case DRINK:{
                    //喝的一定要先用手感受一下他的溫度
                    ((IDrink)food).touch();
                    food.eat();
                    break;
                }
                case DESSERT:{
                    //甜品一定要先欣賞
                    ((IDessert)food).look();
                    food.eat();
                    break;
                }
                case VEGETARIAN:{
                    //素食要先感受下
                    ((IVegetarian)food).feeling();
                    food.eat();
                    break;
                }
                default:{
                    food.eat();
                    break;
                }
            }
        }
    }
}

output:

結賬嘍:---> 24.0
這冰淇淋,簡直就是一件藝術品,開始吃了
冰淇淋,好吃
這漢堡,羊肉味兒+驢肉味兒,迫不及待了
雙層漢堡,真香~~~
剛纔摸了一下,有點冰啊
咕嚕咕嚕~~~

建造者模式的核心就是能夠自由組合對象,就像選食物套餐一樣

完整代碼可以去我的GitHub

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章