设计模式之建造者模式

建造者模式

把复杂的对象进行拆分后组装成新的东西 (我这里不标准有中文主要是方便自己学习)

1.创建目标接口 用来存放 要组装的东西 (武器+ 配置 )

package com.example.设计模式.建造者模式.main;

import java.math.BigDecimal;

/**
 * @Date:2022/4/11
 * @author: ZLF
 */
public interface Cost {
    /**
     * 英雄组成  武器 配招
     *
     * @return 组合
     */
    String scene();
    /**
     * 型号
     *
     * @return 型号
     */
    String model();
    /**
     * 价格
     *
     * @return 价格
     */
    BigDecimal price();
    /**
     * 描述
     *
     * @return 描述
     */
    String desc();
}
  1. 开始把接口实现 存放对应的数据
package com.example.设计模式.建造者模式.main;

import java.math.BigDecimal;

/**
 * @Date:2022/4/11
 * @author: ZLF
 */
public class BowOne implements Cost {
    @Override
    public String scene() {
        return "长弓";
    }

    @Override
    public String model() {
        return "one序列";
    }


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

    @Override
    public String desc() {
        return "平平无奇的长弓";
    }
}

package com.example.设计模式.建造者模式.main;

import java.math.BigDecimal;

/**
 * @Date:2022/4/11
 * @author: ZLF
 */
public class BowTwo implements Cost {
    @Override
    public String scene() {
        return "飓风长弓";
    }

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


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

    @Override
    public String desc() {
        return "飓风成箭";
    }
}

package com.example.设计模式.建造者模式.main;

import java.math.BigDecimal;

/**
 * @Date:2022/4/11
 * @author: ZLF
 */
public class WithRecruitOne implements Cost {
    @Override
    public String scene() {
        return "眩晕";
    }

    @Override
    public String model() {
        return "自带技能";
    }

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

    @Override
    public String desc() {
        return "看起来平平无奇的样子:眩晕";
    }
}

package com.example.设计模式.建造者模式.main;

import java.math.BigDecimal;

/**
 * @Date:2022/4/11
 * @author: ZLF
 */
public class WithRecruitTwo implements Cost {
    @Override
    public String scene() {
        return "沉默";
    }

    @Override
    public String model() {
        return "消费技能";
    }

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

    @Override
    public String desc() {
        return "能让敌人无法使用技能:沉默";
    }
}

3.重写一个接口来提供标准 (武器 配置 都走这个标准)

package com.example.设计模式.建造者模式.parameterImpl;

import com.example.设计模式.建造者模式.main.Cost;

/**
 * 包装接口
 *
 * @Date:2022/4/11
 * @author: ZLF
 */
public interface ICost {
    /**
     * 长弓 武器
     *
     * @param cost 长弓
     * @return 长弓
     */
    ICost apppendBow(Cost cost);

    /**
     * 配招
     *
     * @param cost 配招
     * @return 配招
     */
    ICost apppendWithRecruit(Cost cost);

    /**
     * 明细
     *
     * @return 细节
     */
    String getDetail();
}

4.实现这个接口 (里面的其他属性可要可不要根据自己需求)

package com.example.设计模式.建造者模式.parameterImpl;

import com.example.设计模式.建造者模式.main.Cost;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @Date:2022/4/11
 * @author: ZLF
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ICostImpl implements ICost {
    private List<Cost> list = new ArrayList<Cost>();
    /**
     * 总价
     */
    private BigDecimal totalPriceprice = BigDecimal.ZERO;
    /**
     * 英雄等级
     */
    private String grade;
    /**
     * 购买价格
     */
    private BigDecimal sum;

    public ICostImpl(Double sum, String grade) {
        this.sum = new BigDecimal(sum);
        this.grade = grade;
    }

    @Override
    public ICost apppendBow(Cost cost) {
        list.add(cost);
        totalPriceprice = totalPriceprice.add(sum.multiply(cost.price()));
        return this;
    }

    @Override
    public ICost apppendWithRecruit(Cost cost) {
        list.add(cost);
        totalPriceprice = totalPriceprice.add(sum.multiply(cost.price()));
        return this;
    }

    @Override
    public String getDetail() {
        StringBuilder stringBuilder = new StringBuilder("-------------------------------------------------" +"\n"+
                "英雄清单" +
                "购买数量" + sum);
        for (Cost cost : list) {
            stringBuilder.append(cost.scene()).append(":").append(cost.model())
                    .append(cost.price()).append("元");
        }
        return stringBuilder.append(":").append(totalPriceprice).append("总价格").toString();
    }
}

5.最后就根据自己要的组合去搭配就行了(建造者最后一步组装)

package com.example.设计模式.建造者模式.parameterImpl;

import com.example.设计模式.建造者模式.main.BowOne;
import com.example.设计模式.建造者模式.main.BowTwo;
import com.example.设计模式.建造者模式.main.WithRecruitOne;
import com.example.设计模式.建造者模式.main.WithRecruitTwo;


/**
 * @Date:2022/4/11
 * @author: ZLF
 */
public class ICostImplBuilders {
    public ICost levelOne(Double price) {
        return new ICostImpl(price, "带沉默的高级武器英雄")
                .apppendBow(new BowTwo()).apppendWithRecruit(new WithRecruitTwo());
    }

    public ICost levelTwo(Double price) {
        return new ICostImpl(price, "带眩晕的高级武器英雄")
                .apppendBow(new BowTwo()).apppendWithRecruit(new WithRecruitOne());
    }

    public ICost levelThree(Double price) {
        return new ICostImpl(price, "带眩晕的默认武器英雄")
                .apppendBow(new BowOne()).apppendWithRecruit(new WithRecruitOne());
    }
}

6.测试

package com.example.设计模式.建造者模式.test;

import com.example.设计模式.建造者模式.parameterImpl.ICostImplBuilders;
import org.junit.Test;

/**
 * @Date:2022/4/11
 * @author: ZLF
 */
public class ICostImplTest {
    @Test
    public void test() {
        ICostImplBuilders iCostImplBuilders = new ICostImplBuilders();
        System.out.println(iCostImplBuilders.levelOne(1D).getDetail());
        System.out.println(iCostImplBuilders.levelTwo(1D).getDetail());
        System.out.println(iCostImplBuilders.levelThree(1D).getDetail());
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bes6YC3n-1649682583361)(工厂方法模式.assets/image-20220411210833458.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值