《重学Java筹划模式》之 制作者模式

[复制链接]
发表于 2025-12-28 09:32:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
制作者模式所完成的内容就是通过将多个简单对象通过一步步的组装构建出一个复杂对象的过程
模仿装修公司对于筹划出一些套餐装修服务的场景。
许多装修公司都会给出自家的套餐服务,一样平常有;豪华、轻奢、简约等,这些套餐的背面是差别的商品的组合。按照差别的套餐的代价选取差别的品牌组合,终极再按照装修面积给出一个团体的报价。
这里模仿装修公司想推出一些套餐装修服务,按照差别的代价设定品牌选择组合,以到达使用制作者模式的过程
工程结构



物料接口
  1. public interface IMaterial {
  2.     String name();      // 名称;地板、地砖、涂料、吊顶
  3.     String brand();      // 品牌
  4.     String model();      // 型号
  5.     BigDecimal price();  // 价格
  6.     String desc();       // 描述
  7. }
复制代码
德尔(Der)地板
  1. @Service
  2. public class DerFloorImpl implements IMaterial {
  3.     @Override
  4.     public String name() {
  5.         return "地板";
  6.     }
  7.     @Override
  8.     public String brand() {
  9.         return "德尔(Der)";
  10.     }
  11.     @Override
  12.     public String model() {
  13.         return "A+";
  14.     }
  15.     @Override
  16.     public BigDecimal price() {
  17.         return new BigDecimal(119);
  18.     }
  19.     @Override
  20.     public String desc() {
  21.         return "DER德尔集团是全球领先的专业木地板制造商,北京2008年奥运会家装和公装地板供应商";
  22.     }
  23. }
复制代码
圣象地板
  1. @Service
  2. public class ShengxiangFloorImpl implements IMaterial {
  3.     @Override
  4.     public String name() {
  5.         return "地板";
  6.     }
  7.     @Override
  8.     public String brand() {
  9.         return "圣象";
  10.     }
  11.     @Override
  12.     public String model() {
  13.         return "一级";
  14.     }
  15.     @Override
  16.     public BigDecimal price() {
  17.         return new BigDecimal(119);
  18.     }
  19.     @Override
  20.     public String desc() {
  21.         return "圣象地板是中国地板行业著名品牌。圣象地板拥有中国驰名商标、中国名牌、国家免检、中国环境标志认证等多项荣誉。";
  22.     }
  23. }
复制代码
东鹏地砖
  1. @Service
  2. public class DongPengTileImpl implements IMaterial {
  3.     @Override
  4.     public String name() {
  5.         return "地砖";
  6.     }
  7.     @Override
  8.     public String brand() {
  9.         return "东鹏瓷砖";
  10.     }
  11.     @Override
  12.     public String model() {
  13.         return "10001";
  14.     }
  15.     @Override
  16.     public BigDecimal price() {
  17.         return new BigDecimal(102);
  18.     }
  19.     @Override
  20.     public String desc() {
  21.         return "东鹏瓷砖以品质铸就品牌,科技推动品牌,口碑传播品牌为宗旨,2014年品牌价值132.35亿元,位列建陶行业榜首。";
  22.     }
  23. }
复制代码
马可波罗地砖
  1. @Service
  2. public class MarcoPoloTileImpl implements IMaterial {
  3.     @Override
  4.     public String name() {
  5.         return "地砖";
  6.     }
  7.     @Override
  8.     public String brand() {
  9.         return "马可波罗(MARCO POLO)";
  10.     }
  11.     @Override
  12.     public String model() {
  13.         return "缺省";
  14.     }
  15.     @Override
  16.     public BigDecimal price() {
  17.         return new BigDecimal(140);
  18.     }
  19.     @Override
  20.     public String desc() {
  21.         return "“马可波罗”品牌诞生于1996年,作为国内最早品牌化的建陶品牌,以“文化陶瓷”占领市场,享有“仿古砖至尊”的美誉。";
  22.     }
  23. }
复制代码
一级吊顶
  1. @Service
  2. public class LevelOneCeilingImpl implements IMaterial {
  3.     @Override
  4.     public String name() {
  5.         return "吊顶";
  6.     }
  7.     @Override
  8.     public String brand() {
  9.         return "装修公司自带";
  10.     }
  11.     @Override
  12.     public String model() {
  13.         return "一级顶";
  14.     }
  15.     @Override
  16.     public BigDecimal price() {
  17.         return new BigDecimal(260);
  18.     }
  19.     @Override
  20.     public String desc() {
  21.         return "造型只做低一级,只有一个层次的吊顶,一般离顶120-150mm";
  22.     }
  23. }
复制代码
二级吊顶
  1. @Service
  2. public class LevelTwoCeilingImpl implements IMaterial {
  3.     @Override
  4.     public String name() {
  5.         return "吊顶";
  6.     }
  7.     @Override
  8.     public String brand() {
  9.         return "装修公司自带";
  10.     }
  11.     @Override
  12.     public String model() {
  13.         return "二级顶";
  14.     }
  15.     @Override
  16.     public BigDecimal price() {
  17.         return new BigDecimal(600);
  18.     }
  19.     @Override
  20.     public String desc() {
  21.         return "两个层次的吊顶,二级吊顶高度一般就往下吊20cm,要是层高很高,也可增加每级的厚度";
  22.     }
  23. }
复制代码
制作接口
  1. public interface IMenu {
  2.     IMenu appendCeiling(IMaterial material); // 吊顶
  3.     IMenu appendFloor(IMaterial material);   // 地板
  4.     IMenu appendTile(IMaterial material);    // 地砖
  5.     String getDetail();                 // 明细
  6. }
复制代码
具体制作包
  1. public class DecorationPackageMenu implements IMenu {
  2.     private List<IMaterial> list = new ArrayList<IMaterial>();  // 装修清单
  3.     private BigDecimal price = BigDecimal.ZERO;      // 装修价格
  4.     private BigDecimal area;  // 面积
  5.     private String grade;     // 装修等级;豪华、轻奢
  6.     private DecorationPackageMenu() {
  7.     }
  8.     public DecorationPackageMenu(Double area, String grade) {
  9.         this.area = new BigDecimal(area);
  10.         this.grade = grade;
  11.     }
  12.     @Override
  13.     public IMenu appendCeiling(IMaterial material) {
  14.         list.add(material);
  15.         price = price.add(area.multiply(new BigDecimal("0.2")).multiply(material.price()));
  16.         return this;
  17.     }
  18.     @Override
  19.     public IMenu appendFloor(IMaterial material) {
  20.         list.add(material);
  21.         price = price.add(area.multiply(new BigDecimal("1.5")).multiply(material.price()));
  22.         return this;
  23.     }
  24.     @Override
  25.     public IMenu appendTile(IMaterial material) {
  26.         list.add(material);
  27.         price = price.add(area.multiply(new BigDecimal("1.8")).multiply(material.price()));
  28.         return this;
  29.     }
  30.     @Override
  31.     public String getDetail() {
  32.         StringBuilder detail = new StringBuilder("\r\n-------------------------------------------------------\r\n" +
  33.                 "装修清单" + "\r\n" +
  34.                 "套餐等级:" + grade + "\r\n" +
  35.                 "套餐价格:" + price.setScale(2, BigDecimal.ROUND_HALF_UP) + " 元\r\n" +
  36.                 "房屋面积:" + area.doubleValue() + " 平米\r\n" +
  37.                 "材料清单:\r\n");
  38.         for (IMaterial matter: list) {
  39.             detail.append(matter.brand()).append("、").append(matter.model()).append("、平米价格:").append(matter.price()).append(" 元。\n");
  40.         }
  41.         return detail.toString();
  42.     }
  43. }
复制代码
制作者
  1. @Component
  2. public class Builder {
  3.     public IMenu getLeveOne(Double area){
  4.         DecorationPackageMenu menu = new DecorationPackageMenu(area, "豪华");
  5.         return menu.appendCeiling(new LevelOneCeilingImpl())
  6.                 .appendFloor(new DerFloorImpl())
  7.                 .appendTile(new DongPengTileImpl());
  8.     }
  9.     public IMenu getLeveTwo(Double area){
  10.         DecorationPackageMenu menu = new DecorationPackageMenu(area, "豪华");
  11.         return menu.appendCeiling(new LevelTwoCeilingImpl())
  12.                 .appendFloor(new ShengxiangFloorImpl())
  13.                 .appendTile(new MarcoPoloTileImpl());
  14.     }
  15. }
复制代码
测试
  1.     public Result<?> mockChange1() {
  2.         IMenu leveOne = builder.getLeveOne(100.0);
  3.         IMenu leveTwo = builder.getLeveTwo(100.5);
  4.         log.info("leveOne:{}",leveOne.getDetail());
  5.         log.info("leveTwo:{}",leveTwo.getDetail());
  6.         return Result.ok();
  7.     }
复制代码

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表