设计模式:建造模式---实现对象参数的链式编程

    最近考虑项目结构优化,看过设计模式中的建造模式,自己写一下体会心得记录一下,不对之处还望指正!
    建造模式官方一点的说法:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不不同的表示;自己的理解:该模式适用的场景是一种产品有多种组合形式,每种组合有自己的业务逻辑;该模式我认为主要是优化万能的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());
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43401380/article/details/112948273