建造者模式练习 3、kfc套餐 建造者模式可以用于描述kfc 如何创建套餐: 套餐是一个复杂对象,它一般包含主食(如汉堡、鸡肉卷等)和饮料(如果汁、可乐等)等组成部分, 不同的套餐有不同的组成部分,而kfc的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐,然后返回给顾客。


建造者模式是一种设计模式,用于将一个复杂的对象构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式非常适合于对象的创建步骤较多且复杂的情况,比如KFC的套餐构建。 下面通过一个简单的例子来展示如何使用建造者模式来构建KFC的套餐。 1. 定义产品类(套餐) 首先,定义一个`Meal`类,这个类代表一个套餐,其中包含多个组成部分,如主食和饮料。 ```java public class Meal { private List<Item> items = new ArrayList<>(); public void addItem(Item item) { items.add(item); } public float getCost() { float cost = 0.0f; for (Item item : items) { cost += item.price(); } return cost; } public void showItems() { for (Item item : items) { System.out.print("Item : " + item.name()); System.out.print(", Packing : " + item.packing().pack()); System.out.println(", Price : " + item.price()); } } } ``` 2. 定义抽象构建者 接下来,定义一个抽象的`MealBuilder`类,它声明了构建套餐所需的各个方法。 ```java public abstract class MealBuilder { protected Meal meal; public MealBuilder() { this.meal = new Meal(); } public abstract void buildBurger(); public abstract void buildDrink(); public abstract void buildSnack(); public Meal getMeal() { return meal; } } ``` 3. 实现具体构建者 为不同的套餐实现具体的构建者。例如,为儿童套餐和成人套餐分别创建两个具体的构建者。 儿童套餐构建者 ```java public class KidsMealBuilder extends MealBuilder { @Override public void buildBurger() { meal.addItem(new ChickenBurger()); } @Override public void buildDrink() { meal.addItem(new Coke()); } @Override public void buildSnack() { meal.addItem(new FrenchFries()); } } ``` 成人套餐构建者 ```java public class AdultMealBuilder extends MealBuilder { @Override public void buildBurger() { meal.addItem(new VegBurger()); } @Override public void buildDrink() { meal.addItem(new Pepsi()); } @Override public void buildSnack() { meal.addItem(new OnionRings()); } } ``` 4. 定义导演类 导演类负责调用构建者的各个方法来构建具体的套餐。 ```java public class Waiter { private MealBuilder mealBuilder; public void setMealBuilder(MealBuilder mb) { this.mealBuilder = mb; } public Meal getMeal() { return mealBuilder.getMeal(); } public void constructMeal() { mealBuilder.buildBurger(); mealBuilder.buildDrink(); mealBuilder.buildSnack(); } } ``` 5. 定义产品部件 定义具体的食品和饮料类,这些是套餐的组成部分。 ```java public interface Item { String name(); Packing packing(); float price(); } public interface Packing { String pack(); } public class Wrapper implements Packing { @Override public String pack() { return "Wrapper"; } } public class Bottle implements Packing { @Override public String pack() { return "Bottle"; } } public class VegBurger implements Item { @Override public String name() { return "Veg Burger"; } @Override public Packing packing() { return new Wrapper(); } @Override public float price() { return 50.0f; } } public class ChickenBurger implements Item { @Override public String name() { return "Chicken Burger"; } @Override public Packing packing() { return new Wrapper(); } @Override public float price() { return 60.0f; } } public class Coke implements Item { @Override public String name() { return "Coke"; } @Override public Packing packing() { return new Bottle(); } @Override public float price() { return 30.0f; } } public class Pepsi implements Item { @Override public String name() { return "Pepsi"; } @Override public Packing packing() { return new Bottle(); } @Override public float price() { return 35.0f; } } public class FrenchFries implements Item { @Override public String name() { return "French Fries"; } @Override public Packing packing() { return new Wrapper(); } @Override public float price() { return 20.0f; } } public class OnionRings implements Item { @Override public String name() { return "Onion Rings"; } @Override public Packing packing() { return new Wrapper(); } @Override public float price() { return 25.0f; } } ``` 6. 使用示例 我们可以通过以下代码来演示如何使用上述类来构建不同类型的套餐。 ```java public class KFCMealBuilderDemo { public static void main(String[] args) { Waiter waiter = new Waiter(); MealBuilder kidsMealBuilder = new KidsMealBuilder(); waiter.setMealBuilder(kidsMealBuilder); waiter.constructMeal(); Meal kidsMeal = waiter.getMeal(); kidsMeal.showItems(); System.out.println("Total Cost: " + kidsMeal.getCost()); MealBuilder adultMealBuilder = new AdultMealBuilder(); waiter.setMealBuilder(adultMealBuilder); waiter.constructMeal(); Meal adultMeal = waiter.getMeal(); adultMeal.showItems(); System.out.println("Total Cost: " + adultMeal.getCost()); } } ``` 这段代码展示了如何使用建造者模式来构建不同类型的KFC套餐,并打印出每个套餐的详细信息及其总价格。 [2024-10-24 16:59:34 | AI写代码神器 | 1350点数解答]
- 编写一个函数,该函数可以将一个对象的所有属性值转换为字符串类型,包括嵌套的对象属性。如果属 性值已经是字符串,则保持不变。要求使用递归方式实现。 输入:对象 { a: 1, b: { c: 2, d: '3' }, e: [4, 5, 6] } 输出:对象 { a: "1", b: { c: "2", d: "3" }, e: ["4", "5", "6"] }(143点数解答 | 2024-11-08 10:25:12)259
- 编写一个函数,该函数可以将一个对象的所有属性值转换为字符串类型,包括嵌套的对象属性。如果属性值已经是字符串,则保持不变。要求使用递归方式实现。 输入:对象 { a: 1, b: { c: 2, d: '3' }, e: [4, 5, 6] } 输出:对象 { a: "1", b: { c: "2", d: "3" }, e: ["4", "5", "6"] }(142点数解答 | 2024-11-11 21:06:15)153
- 编写一个函数,该函数可以将一个对象的所有属性值转换为字符串类型,包括嵌套的对象属性。如果属性值已经是字符串,则保持不变。要求使用递归方式实现。 输入:对象 { a: 1, b: { c: 2, d: '3' }, e: [4, 5, 6] } 输出:对象 { a: "1", b: { c: "2", d: "3" }, e: ["4", "5", "6"] }(467点数解答 | 2024-11-12 09:07:17)158
- 创建成绩类,包含: 属性:平时成绩(int)、期末成绩(int) 方法:计算总成绩(计算规则:平时成绩*0.4+期末成绩*0.6,保留整数部分,小数部分直接丢弃) 创建学生类,包含: 属性:学号(string)、姓名(string)、语文成绩(成绩类)、数学成绩(成绩类)、物理成绩(成绩类) 方法:计算总分、计算平均分 输入3个学生的信息,将每个学生的信息封装在一个学生对象中。 按输入顺序依次输出3个学生的总分、平均分(精确到小数点后两位,舍去部分按四舍五入规则计入最后一位)。(847点数解答 | 2024-10-11 08:45:50)539
- 创建成绩类,包含: 属性:平时成绩(int)、期末成绩(int) 方法:计算总成绩(计算规则:平时成绩*0.4+期末成绩*0.6,保留整数部分,小数部分直接丢弃) 创建学生类,包含: 属性:学号(string)、姓名(string)、语文成绩(成绩类)、数学成绩(成绩类)、物理成绩(成绩类) 方法:计算总分、计算平均分 输入3个学生的信息,将每个学生的信息封装在一个学生对象中。 按输入顺序依次输出3个学生的总分、平均分(精确到小数点后两位,舍去部分按四舍五入规则计入最后一位)。 浮点数保留小数的相关知识可参考:https://blog.csdn.net/huaishuming/article/details/17752365 注意:未用学生类对象封装数据的,本题计0分(581点数解答 | 2024-11-19 15:54:02)303
- 成绩计算-2-关联类 分数 50 作者 蔡轲 单位 南昌航空大学 创建成绩类,包含: 属性:平时成绩(int)、期末成绩(int) 方法:计算总成绩(计算规则:平时成绩*0.4+期末成绩*0.6,保留整数部分,小数部分直接丢弃) 创建学生类,包含: 属性:学号(String)、姓名(String)、语文成绩(成绩类)、数学成绩(成绩类)、物理成绩(成绩类) 方法:计算总分、计算平均分 输入3个学生的信息,将每个学生的信息封装在一个学生对象中。 按输入顺序依次输出3个学生的总分、平均分(精确到小数点后两位,舍去部分按四舍五入规则计入最后一位)。 浮点数保留小数的相关知识可参考:https://blog.csdn.net/huaishuming/article/details/17752365 注意:未用学生类对象封装数据的,本题计0分(655点数解答 | 2025-04-18 11:41:55)184
- 7-2 成绩计算-2-关联类 分数 50 作者 蔡轲 单位 南昌航空大学 创建成绩类,包含: 属性:平时成绩(int)、期末成绩(int) 方法:计算总成绩(计算规则:平时成绩*0.4+期末成绩*0.6,保留整数部分,小数部分直接丢弃) 创建学生类,包含: 属性:学号(String)、姓名(String)、语文成绩(成绩类)、数学成绩(成绩类)、物理成绩(成绩类) 方法:计算总分、计算平均分 输入3个学生的信息,将每个学生的信息封装在一个学生对象中。 按输入顺序依次输出3个学生的总分、平均分(精确到小数点后两位,舍去部分按四舍五入规则计入最后一位)。 浮点数保留小数的相关知识可参考:https://blog.csdn.net/huaishuming/article/details/17752365 注意:未用学生类对象封装数据的,本题计0分 输入格式: 依次输入3个学生的每门课成绩,每个学生成绩信息格式: 学号+英文空格+姓名+英文空格+课程名+英文空格+平时成绩+英文空格+期末成绩 注:3个学生的课程顺序可能会不一致 例如: 22201311 张琳 语文 7(621点数解答 | 2025-04-18 11:43:55)235
- 题目描述 众所周知,鱼越大,鱼刺越大,鱼刺越大,肉越少,肉越少,鱼越小,所以鱼越大,鱼越小。 请问, 𝑛 n 条大小不一的鱼中,第 𝑖 i 大的鱼,是第几小的鱼? 输入格式 输入包括 1 1 行,包含 2 2 个整数 𝑛 , 𝑖 n,i,分别表示鱼的数量 𝑛 n,和指定鱼是第 𝑖 i大的鱼。 输出格式 输出包括 1 1 行,包含 1 1 个整数,为指定鱼是第几小的鱼。(240点数解答 | 2025-08-01 21:38:06)52
- 题目描述 众所周知,鱼越大,鱼刺越大,鱼刺越大,肉越少,肉越少,鱼越小,所以鱼越大,鱼越小。 请问, 𝑛 n 条大小不一的鱼中,第 𝑖 i 大的鱼,是第几小的鱼? 输入格式 输入包括 1 1 行,包含 2 2 个整数 𝑛 , 𝑖 n,i,分别表示鱼的数量 𝑛 n,和指定鱼是第 𝑖 i大的鱼。 输出格式 输出包括 1 1 行,包含 1 1 个整数,为指定鱼是第几小的鱼。(476点数解答 | 2025-08-01 21:38:52)71
- 题目描述 众所周知,鱼越大,鱼刺越大,鱼刺越大,肉越少,肉越少,鱼越小,所以鱼越大,鱼越小。 请问, 𝑛 n 条大小不一的鱼中,第 𝑖 i 大的鱼,是第几小的鱼? 输入格式 输入包括 1 1 行,包含 2 2 个整数 𝑛 , 𝑖 n,i,分别表示鱼的数量 𝑛 n,和指定鱼是第 𝑖 i大的鱼。 输出格式 输出包括 1 1 行,包含 1 1 个整数,为指定鱼是第几小的鱼。 c++(213点数解答 | 2025-08-01 21:39:26)54
- 查询图书: 设计一个方法 findbook(string isbn),根据 isbn 返回对应的图书对象。如果未找到,返回 null。(292点数解答 | 2024-07-04 23:28:11)174
- 配餐公司在配餐搭配时,分为主食、荤菜、素菜、汤共四类,每份配餐可以从四类中分别选择一类,如 下: .主食:米饭、面条、馒头 .荤菜:宫保鸡丁、鱼香肉丝、红烧带鱼、炖牛肉、青椒肉丝 ·素菜:清炒芦笋、香菇油菜、西红柿蛋、酱爆圆白菜 ·汤:西红柿鸡蛋汤、紫菜蛋花汤、小米粥请设计程序打印所有的搭配组合,并统计有多少种组合。(347点数解答 | 2024-05-14 17:08:07)179