当前位置: 首页 > article >正文

《重学Java设计模式》之 建造者模式

建造者模式所完成的内容就是通过将多个简单对象通过一步步的组装构建出一个复杂对象的过程

模拟装修公司对于设计出一些套餐装修服务的场景。

很多装修公司都会给出自家的套餐服务,一般有;豪华、轻奢、简约等,这些套餐的后面是不同的商品的组合。按照不同的套餐的价格选取不同的品牌组合,最终再按照装修面积给出一个整体的报价。

这里模拟装修公司想推出一些套餐装修服务,按照不同的价格设定品牌选择组合,以达到使用建造者模式的过程

工程结构

物料接口

public interface IMaterial {

    String name();      // 名称;地板、地砖、涂料、吊顶

    String brand();      // 品牌

    String model();      // 型号

    BigDecimal price();  // 价格

    String desc();       // 描述
}

德尔(Der)地板

@Service
public class DerFloorImpl implements IMaterial {
    @Override
    public String name() {
        return "地板";
    }

    @Override
    public String brand() {
        return "德尔(Der)";
    }

    @Override
    public String model() {
        return "A+";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(119);
    }

    @Override
    public String desc() {
        return "DER德尔集团是全球领先的专业木地板制造商,北京2008年奥运会家装和公装地板供应商";
    }
}

圣象地板

@Service
public class ShengxiangFloorImpl implements IMaterial {
    @Override
    public String name() {
        return "地板";
    }

    @Override
    public String brand() {
        return "圣象";
    }

    @Override
    public String model() {
        return "一级";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(119);
    }

    @Override
    public String desc() {
        return "圣象地板是中国地板行业著名品牌。圣象地板拥有中国驰名商标、中国名牌、国家免检、中国环境标志认证等多项荣誉。";
    }
}

东鹏地砖

@Service
public class DongPengTileImpl implements IMaterial {
    @Override
    public String name() {
        return "地砖";
    }

    @Override
    public String brand() {
        return "东鹏瓷砖";
    }

    @Override
    public String model() {
        return "10001";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(102);
    }

    @Override
    public String desc() {
        return "东鹏瓷砖以品质铸就品牌,科技推动品牌,口碑传播品牌为宗旨,2014年品牌价值132.35亿元,位列建陶行业榜首。";
    }
}

马可波罗地砖

@Service
public class MarcoPoloTileImpl implements IMaterial {
    @Override
    public String name() {
        return "地砖";
    }

    @Override
    public String brand() {
        return "马可波罗(MARCO POLO)";
    }

    @Override
    public String model() {
        return "缺省";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(140);
    }

    @Override
    public String desc() {
        return "“马可波罗”品牌诞生于1996年,作为国内最早品牌化的建陶品牌,以“文化陶瓷”占领市场,享有“仿古砖至尊”的美誉。";
    }
}

一级吊顶

@Service
public class LevelOneCeilingImpl implements IMaterial {
    @Override
    public String name() {
        return "吊顶";
    }

    @Override
    public String brand() {
        return "装修公司自带";
    }

    @Override
    public String model() {
        return "一级顶";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(260);
    }

    @Override
    public String desc() {
        return "造型只做低一级,只有一个层次的吊顶,一般离顶120-150mm";
    }
}

二级吊顶

@Service
public class LevelTwoCeilingImpl implements IMaterial {
    @Override
    public String name() {
        return "吊顶";
    }

    @Override
    public String brand() {
        return "装修公司自带";
    }

    @Override
    public String model() {
        return "二级顶";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(600);
    }

    @Override
    public String desc() {
        return "两个层次的吊顶,二级吊顶高度一般就往下吊20cm,要是层高很高,也可增加每级的厚度";
    }
}

建造接口

public interface IMenu {

    IMenu appendCeiling(IMaterial material); // 吊顶

    IMenu appendFloor(IMaterial material);   // 地板

    IMenu appendTile(IMaterial material);    // 地砖

    String getDetail();                 // 明细
}

具体建造包

public class DecorationPackageMenu implements IMenu {

    private List<IMaterial> list = new ArrayList<IMaterial>();  // 装修清单
    private BigDecimal price = BigDecimal.ZERO;      // 装修价格

    private BigDecimal area;  // 面积

    private String grade;     // 装修等级;豪华、轻奢

    private DecorationPackageMenu() {
    }

    public DecorationPackageMenu(Double area, String grade) {
        this.area = new BigDecimal(area);
        this.grade = grade;
    }
    @Override
    public IMenu appendCeiling(IMaterial material) {
        list.add(material);
        price = price.add(area.multiply(new BigDecimal("0.2")).multiply(material.price()));
        return this;
    }

    @Override
    public IMenu appendFloor(IMaterial material) {
        list.add(material);
        price = price.add(area.multiply(new BigDecimal("1.5")).multiply(material.price()));
        return this;
    }

    @Override
    public IMenu appendTile(IMaterial material) {
        list.add(material);
        price = price.add(area.multiply(new BigDecimal("1.8")).multiply(material.price()));
        return this;
    }

    @Override
    public String getDetail() {
        StringBuilder detail = new StringBuilder("\r\n-------------------------------------------------------\r\n" +
                "装修清单" + "\r\n" +
                "套餐等级:" + grade + "\r\n" +
                "套餐价格:" + price.setScale(2, BigDecimal.ROUND_HALF_UP) + " 元\r\n" +
                "房屋面积:" + area.doubleValue() + " 平米\r\n" +
                "材料清单:\r\n");

        for (IMaterial matter: list) {
            detail.append(matter.brand()).append("、").append(matter.model()).append("、平米价格:").append(matter.price()).append(" 元。\n");
        }

        return detail.toString();
    }
}

建造者

@Component
public class Builder {

    public IMenu getLeveOne(Double area){

        DecorationPackageMenu menu = new DecorationPackageMenu(area, "豪华");
        return menu.appendCeiling(new LevelOneCeilingImpl())
                .appendFloor(new DerFloorImpl())
                .appendTile(new DongPengTileImpl());

    }

    public IMenu getLeveTwo(Double area){

        DecorationPackageMenu menu = new DecorationPackageMenu(area, "豪华");
        return menu.appendCeiling(new LevelTwoCeilingImpl())
                .appendFloor(new ShengxiangFloorImpl())
                .appendTile(new MarcoPoloTileImpl());

    }
}

测试

    public Result<?> mockChange1() {
        IMenu leveOne = builder.getLeveOne(100.0);

        IMenu leveTwo = builder.getLeveTwo(100.5);

        log.info("leveOne:{}",leveOne.getDetail());
        log.info("leveTwo:{}",leveTwo.getDetail());


        return Result.ok();
    }


http://www.kler.cn/a/388442.html

相关文章:

  • @JsonCreator 注解
  • 【前端】MVC模式详解:如何构建高效的Web应用程序?
  • MySQL45讲 第三十六讲 为什么临时表可以重名?——阅读总结
  • DP动态规划+贪心题目汇总
  • Vue.use()和Vue.component()
  • Educational Codeforces Round 173 (Rated for Div. 2)
  • 第三十八章 章节练习之面经页面
  • (一)<江科大STM32>——软件环境搭建+新建工程步骤
  • conda 启动时添加执行脚本
  • 优化布线拥塞
  • vue/react做多语言国际化的时候,在语言配置中不同的语言配置不同的字体,动态引入scss里面
  • spring gateway 动态路由
  • Python pandas库:强大的数据处理工具
  • NoSQL大数据存储技术测试(2)NoSQL数据库的基本原理
  • DU模拟器(S5040A Open RAN Studio Player and Capture Appliance)
  • OSS和FastDFS的详细比较
  • 宝塔面板中使用Acme SSL.cn申请的免费HTTPS SSL证书安装步骤
  • 如何进行数据库连接池的参数优化?
  • 默认 iOS 设置使已锁定的 iPhone 容易受到攻击
  • 2024-11-01 - 统一身份认证 - OpenLdap - 中间件 - 流雨声
  • 【SAP FICO】财务三大报表_2-进阶(杜邦分析法、资产负债表-数据表结构、取数逻辑)
  • DOM事件监听 (鼠标事件,键盘事件,表单事件)
  • 【.Net Core/.Net8教程】巧用 C# 8.0 切片语法:高效处理数组和字符串
  • 【微服务】Docker 容器化
  • 两个matlab在线编译网站
  • golang常见面试题-基础篇