最近考虑项目结构优化,看过设计模式中的建造模式,自己写一下体会心得记录一下,不对之处还望指正!
建造模式官方一点的说法:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不不同的表示;自己的理解:该模式适用的场景是一种产品有多种组合形式,每种组合有自己的业务逻辑;该模式我认为主要是优化万能的if else结构;使代码瘦身不至于过于臃肿.
建造模式从我接触的业务中,微信支付中用到的封装好api中weixin-java-pay就使用了该模式,有兴趣的可以看一下WxPayUnifiedOrderRequest的实现(微信下单对象中可自定义添加商品描述或是过期时间等下单信息).自己写了一个案例,可以简单的说明一下这个模式.
话说吃一个鸡蛋灌饼可以加鸡蛋加里脊加烤肠等等,加不同的东西,价格也不同.最简单的实现方式就是:
if(鸡蛋+里脊){
价格1....
}else if(鸡蛋+烤肠){
价格2....
}else if(里脊+烤肠){
价格3.....
}
如果组合形式更多则项目结构会变得更加臃肿,建造者模式可以进行瘦身,涉及代码如下:
/**
* @ClassName: EggCakeCompose
* @Desc: 鸡蛋灌饼的组合形式
* @Author: txm
* @Date: 2021/1/21 10:16
**/
public interface EggCakeCombination {
// 添加鸡蛋
EggCakeCombination appendEgg();
// 添加烤肠
EggCakeCombination appendSausages();
// 添加里脊
EggCakeCombination appendLiJi();
// 添加其他.....
// 描述信息
String getDesc();
}
/**
* @ClassName: EggCakeCombinationImp
* @Desc: 鸡蛋灌饼数据填充实现类
* @Author: txm
* @Date: 2021/1/21 10:42
**/
public class EggCakeCombinationImp implements EggCakeCombination {
private int price=2; // 饼价格
private List<String> detailList=new ArrayList<>(); // 描述详情信息
private int eggCount; // 鸡蛋
private int sausagesCount; // 烤肠
private int liGiCount; // 里脊
@Override
public EggCakeCombination appendEgg() {
System.out.println("加鸡蛋"); // 添加鸡蛋逻辑
detailList.add(String.valueOf(++eggCount)); // 鸡蛋数累加
price+=0.5; // 每加一个鸡蛋加价0.5元
return this;
}
@Override
public EggCakeCombination appendSausages() {
System.out.println("加烤肠"); // 添加烤肠逻辑
detailList.add(String.valueOf(++sausagesCount)); // 烤肠累加
price+=1; // 每加一个烤肠加价1元
return this;
}
@Override
public EggCakeCombination appendLiJi() {
System.out.println("加里脊"); // 添加里脊逻辑
detailList.add(String.valueOf(++liGiCount)); // 里脊个数累加
price+=2; // 每加一个里脊加价2元
return this;
}
public static EggCakeCombination build(){
// 创建鸡蛋灌饼套餐
return new EggCakeCombinationImp();
}
@Override
public String getDesc(){
// 组装描述信息
StringBuilder stringBuilder=new StringBuilder("");
stringBuilder = stringBuilder.append("总价:").append(price).append("元;套餐为:一张饼 ");
stringBuilder=(eggCount == 0) ? stringBuilder : stringBuilder.append(eggCount+"个鸡蛋 ");
stringBuilder=(sausagesCount == 0) ? stringBuilder : stringBuilder.append(sausagesCount+"个烤肠 ");
stringBuilder=(liGiCount == 0) ? stringBuilder : stringBuilder.append(sausagesCount+"个里脊 ");
return stringBuilder.toString();
}
}
测试组装自己心仪的鸡蛋灌饼:
public static void main(String[] args) {
EggCakeCombination eggCakeCombination = EggCakeCombinationImp.build().appendSausages().appendLiJi().appendLiJi();
String desc = eggCakeCombination.getDesc();
System.out.println(desc);
}
打印数据:
加烤肠
加里脊
加里脊
总价:7元;套餐为:一张饼 1个烤肠 1个里脊
这样就能实现自己想要的豪华版的鸡蛋灌饼.
补偿:实现自定义PersonalWexinBuilder
public class PersonalWexinBuilder {
private String orderId;
private String appId;
private String orderAccount;
private WexinBuilder wexinBuilder;
public class WexinBuilder{
private String orderId;
private String appId;
private String orderAccount;
// 设置订单id
public WexinBuilder builderOrderId(String orderId){
this.orderId=orderId;
return this;
}
// 设置APPId
public WexinBuilder builderAppId(String appId){
this.appId=appId;
return this;
}
// 设置订单金额
public WexinBuilder builderOrderAccount(String orderAccount){
this.orderAccount=orderAccount;
return this;
}
// 创建PersonalWechatBuilder对象
public PersonalWechatBuilder build(){
return new PersonalWechatBuilder();
}
@Override
public String toString() {
return "WexinBuilder{" +
"orderId='" + orderId + '\'' +
", appId='" + appId + '\'' +
", orderAccount='" + orderAccount + '\'' +
'}';
}
}
// 测试
public static void main(String[] args) {
System.out.println(new PersonalWechatBuilder().wexinBuilder.builderAppId("456000").builderOrderId("789").builderOrderAccount("123").build());
}
}