什么是设计模式
设计模式是经常使用、大多数人知道,有特定目录的代码设计经验。设计模式可以提高代码可维护性,可提升代码运行效率,也能提高系统可靠性。设计模式可以分为三类,分别是创建型、结构型和行为型。以下就建造者模式简要概述。
什么是建造者模式
建造者模式就是将多个简单的对象一步步构建为复杂大对象,这种模式也是创建型模式,是创建对象的最佳方式。
应用场景
建造者模式一般应用于内部结构复杂、可灵活组合多个对象产生不同结果的大对象情况。比如去商店买水果,可以选择不同的套餐,每个套餐又包含不同的水果,作为消费者只需要选择套餐即可。
小试牛刀
我们以水果店的套餐作为测试用例。
首先创建一个账单接口Accounts,内部提供商品名称和商品价格两个方法。然后我们创建苹果、梨子、香蕉三个实现账单接口。再准备一个套餐实体Meal,内部提供添加商品、获取商品列表、获取商品名和总价的方法。再者,我们再创建一个套餐生产者MealBuilder用来生产套餐Meal。最后,我们消费者只需要选择套餐即可拿到我们需要的商品组合。
1、账单接口Accounts
/**
* 结账单
* @author senfel
* @version 1.0
* @date 2022/8/11 11:44
*/
public interface Accounts {
/**
* 商品名称
* @return
*/
String goodsName();
/**
* 价格
* @return
*/
Double cost();
}
2、三个水果类并实现账单接口
/**
* 苹果
* @author senfel
* @version 1.0
* @date 2022/8/11 11:49
*/
public class Apple implements Accounts{
@Override
public String goodsName() {
return "苹果";
}
@Override
public Double cost() {
return 10.00;
}
}
/**
* 香蕉
* @author senfel
* @version 1.0
* @date 2022/8/11 11:51
*/
public class Banana implements Accounts{
@Override
public String goodsName() {
return "香蕉";
}
@Override
public Double cost() {
return 5.60;
}
}
/**
* 梨子
* @author senfel
* @version 1.0
* @date 2022/8/11 11:52
*/
public class Pear implements Accounts{
@Override
public String goodsName() {
return "梨子";
}
@Override
public Double cost() {
return 9.52;
}
}
3、套餐
/**
* 套餐
* @author senfel
* @version 1.0
* @date 2022/8/11 11:55
*/
@Data
public class Meal {
private List<Accounts> accountsList = new ArrayList<>();
/**
* 套餐名称
*/
private String mealName;
public Meal(String mealName) {
this.mealName = mealName;
}
/**
* 新增商品
*/
public void addGoods(Accounts accounts){
accountsList.add(accounts);
}
/**
* 商品列表
*/
public void showGoods(){
accountsList.stream().forEach(obj ->{
System.err.println("商品:"+obj.goodsName()+" 单价:"+obj.cost());
});
}
/**
* 获取价格
* @return
*/
public Double getMealPrice(){
if(accountsList.size() == 0){
return 0.00;
}
AtomicReference<Double> price = new AtomicReference<>(0.00);
accountsList.forEach(obj->{
price.updateAndGet(v -> v + obj.cost());
});
return BigDecimal.valueOf(price.get()).setScale(2, RoundingMode.HALF_UP).doubleValue();
}
}
4、用构建者来生产套餐
/**
* 套餐建造
* @author senfel
* @version 1.0
* @date 2022/8/11 13:38
*/
public class MealBuilder {
/**
* 套餐一
* @return
*/
public Meal buildMealOne(){
Meal meal = new Meal("套餐一");
meal.addGoods(new Apple());
meal.addGoods(new Banana());
return meal;
}
/**
* 套餐二
* @return
*/
public Meal buildMealTwo(){
Meal meal = new Meal("套餐二");
meal.addGoods(new Apple());
meal.addGoods(new Banana());
meal.addGoods(new Pear());
return meal;
}
}
5、消费者消费套餐
/**
* 建造者模式测试
* @author senfel
* @version 1.0
* @date 2022/8/11 13:42
*/
@SpringBootTest
public class TestMealModel {
@Test
public void test(){
//获取套餐一
Meal meal = new MealBuilder().buildMealOne();
System.err.println("套餐名称:"+meal.getMealName());
meal.showGoods();
System.err.println("套餐价格:"+meal.getMealPrice());
//获取套餐二
Meal mealTwo = new MealBuilder().buildMealTwo();
System.err.println("套餐名称:"+mealTwo.getMealName());
mealTwo.showGoods();
System.err.println("套餐价格:"+mealTwo.getMealPrice());
}
}
消费情况:
套餐名称:套餐一
商品:苹果 单价:10.0
商品:香蕉 单价:5.6
套餐价格:15.6
套餐名称:套餐二
商品:苹果 单价:10.0
商品:香蕉 单价:5.6
商品:梨子 单价:9.52
套餐价格:25.12
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/154697.html