建造者模式
把复杂的对象进行拆分后组装成新的东西 (我这里不标准有中文主要是方便自己学习)
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();
}
- 开始把接口实现 存放对应的数据
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)]