java中使用建筑者模式进行参数对象构造 – 设计模式(三)

人生之路坎坎坷坷,跌跌撞撞在所难免。但是,不论跌了多少次,你都必须坚强勇敢地站起来。任何时候,无论你面临着生命的何等困惑抑或经受着多少挫折,无论道路多艰难,希望变得如何渺茫,请你不要绝望,再试一次,坚持到底,成功终将属于勇不言败的你。

导读:本篇文章讲解 java中使用建筑者模式进行参数对象构造 – 设计模式(三),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

什么是建筑者模式

链接: 菜鸟教程之建造者模式.

建造者模式
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

建筑者模式的好处

意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,
其通常由各个部分的子对象用一定的算法构成;由于需求的变化,
这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

何时使用:一些基本部件不会变,而其组合经常变化的时候。

如何解决:将变与不变分离开。

关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。

应用实例: 
1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,
而其组合是经常变化的,生成出所谓的"套餐"。 
2、JAVA 中的 StringBuilder。

优点: 1、建造者独立,易扩展。 2、便于控制细节风险。

缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。

注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

如何使用建筑者模式

这里就拿闪送开发平台接口做个例子

大商户型提交订单接口
在这里插入图片描述
开发者型提交订单接口
在这里插入图片描述

原先的代码


public class SsOrderPlaceDTO {

    /**
     * 开发者appId(都有)
     */
    private String clientId;

    /**
     * 签名(都有)
     */
    private String sign;

    /**
     * 时间戳(都有)
     */
    private long timestamp;
    
	/**
     * 业务入参(都有)
     */
    private Data data;
    
    /**
     * token (授权型专有)
     */
    private String accessToken;

    /**
     * 商户ID(大商户型专有)
     */
    private String shopId;


    public static class Data{

        private String issOrderNo;

        public String getIssOrderNo() {
            return issOrderNo;
        }

        public void setIssOrderNo(String issOrderNo) {
            this.issOrderNo = issOrderNo;
        }

        @Override
        public String toString() {
            return "Data{" +
                    "issOrderNo='" + issOrderNo + '\'' +
                    '}';
        }
    }

    public String getClientId() {
        return clientId;
    }

    public void setClientId(String clientId) {
        this.clientId = clientId;
    }

    public String getSign() {
        return sign;
    }

    public void setSign(String sign) {
        this.sign = sign;
    }

    public long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(long timestamp) {
        this.timestamp = timestamp;
    }

    public String getAccessToken() {
        return accessToken;
    }

    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }

    public String getShopId() {
        return shopId;
    }

    public void setShopId(String shopId) {
        this.shopId = shopId;
    }

    public Data getData() {
        return data;
    }

    public void setData(Data data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "SsOrderPlaceDTO{" +
                "clientId='" + clientId + '\'' +
                ", sign='" + sign + '\'' +
                ", timestamp='" + timestamp + '\'' +
                ", accessToken='" + accessToken + '\'' +
                ", shopId='" + shopId + '\'' +
                ", data=" + data +
                '}';
    }
}

public class Test {

    /**
     * 闪送签名方法
     */
    public static String sign(){
        // 省略....
        return "sign";
    }

    /**
     * 闪送提交订单接口
     */
    public static void orderPlace(SsOrderPlaceDTO dto){
        System.out.println(dto.toString());
        // 业务逻辑省略.....
    }

    public static void main(String[] args) {
        // 授权型
        SsOrderPlaceDTO authorize = new SsOrderPlaceDTO();
        SsOrderPlaceDTO.Data authorizeData = new SsOrderPlaceDTO.Data();
        authorizeData.setIssOrderNo("授权型 IssOrderNo");
        authorize.setData(authorizeData);
        authorize.setAccessToken("授权型 AccessToken");
        authorize.setClientId("授权型 ClientId");
        authorize.setTimestamp(System.currentTimeMillis());
        authorize.setSign(sign());
        orderPlace(authorize);

        // 大商户型
        SsOrderPlaceDTO business = new SsOrderPlaceDTO();
        SsOrderPlaceDTO.Data businessData = new SsOrderPlaceDTO.Data();
        businessData.setIssOrderNo("大商户型 IssOrderNo");
        business.setData(businessData);
        business.setShopId("大商户型 ShopId");
        business.setClientId("大商户型 ClientId");
        business.setTimestamp(System.currentTimeMillis());
        business.setSign(sign());
        orderPlace(business);

    }

}

使用建筑者模式的代码


package com.wkr.controller;

public class SsOrderPlaceDTO {

    /**
     * 开发者appId(都有)
     */
    private String clientId;

    /**
     * 签名(都有)
     */
    private String sign;

    /**
     * 时间戳(都有)
     */
    private long timestamp;

	/**
     * 业务入参(都有)
     */
    private Data data;

    /**
     * token (授权型专有)
     */
    private String accessToken;

    /**
     * 商户ID(大商户型专有)
     */
    private String shopId;

    public static class Data{

        private String issOrderNo;

        public String getIssOrderNo() {
            return issOrderNo;
        }

        public void setIssOrderNo(String issOrderNo) {
            this.issOrderNo = issOrderNo;
        }

        @Override
        public String toString() {
            return "Data{" +
                    "issOrderNo='" + issOrderNo + '\'' +
                    '}';
        }
    }


    public String getClientId() {
        return clientId;
    }

    public void setClientId(String clientId) {
        this.clientId = clientId;
    }

    public String getSign() {
        return sign;
    }

    public void setSign(String sign) {
        this.sign = sign;
    }

    public long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(long timestamp) {
        this.timestamp = timestamp;
    }

    public String getAccessToken() {
        return accessToken;
    }

    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }

    public String getShopId() {
        return shopId;
    }

    public void setShopId(String shopId) {
        this.shopId = shopId;
    }

    public Data getData() {
        return data;
    }

    public void setData(Data data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "SsOrderPlaceDTO{" +
                "clientId='" + clientId + '\'' +
                ", sign='" + sign + '\'' +
                ", timestamp='" + timestamp + '\'' +
                ", accessToken='" + accessToken + '\'' +
                ", shopId='" + shopId + '\'' +
                ", data=" + data +
                '}';
    }


    private SsOrderPlaceDTO(SsOrderPlaceDTO.Builder builder) {
       this.clientId = builder.clientId;
       this.sign = builder.sign;
       this.timestamp = builder.timestamp;
       this.accessToken = builder.accessToken;
       this.shopId = builder.shopId;
       this.data = builder.data;
    }

    public static final class Builder {

        /**
         * 开发者appId(都有)
         */
        private String clientId;

        /**
         * 签名(都有)
         */
        private String sign;

        /**
         * 时间戳(都有)
         */
        private long timestamp;
        
		/**
	     * 业务入参(都有)
	     */
        private Data data;

        /**
         * token (授权型专有)
         */
        private String accessToken;

        /**
         * 商户ID(大商户型专有)
         */
        private String shopId;

        /**
         * 通用的
         */
        public Builder(String clientId, String IssOrderNo) {
            this.clientId = clientId;
            this.timestamp = System.currentTimeMillis();
            SsOrderPlaceDTO.Data data = new SsOrderPlaceDTO.Data();
            data.setIssOrderNo(IssOrderNo);
            this.data = data;
        }

        /**
         * 授权型 独有
         */
        public SsOrderPlaceDTO.Builder authorize(String accessToken) {
            this.accessToken = accessToken;
            return this;
        }

        /**
         * 大商户 独有
         */
        public SsOrderPlaceDTO.Builder bigBusiness(String shopId) {
            this.shopId = shopId;
            return this;
        }

        /**
         * 签名 都要进行签名
         */
        private SsOrderPlaceDTO.Builder sign() {
            this.sign = Test.sign();
            return this;
        }

        public SsOrderPlaceDTO build() {
            return new SsOrderPlaceDTO(sign());
        }
    }
}


public class Test {

    /**
     * 模拟的闪送签名方法
     */
    public static String sign(){
        // 省略....
        return "sign";
    }

    /**
     * 闪送提交订单接口
     */
    public static void orderPlace(SsOrderPlaceDTO dto){
        System.out.println(dto.toString());
        // 业务逻辑省略.....
    }

    public static void main(String[] args) {


        // 授权型
        SsOrderPlaceDTO authorize = new SsOrderPlaceDTO
                .Builder("授权型 ClientId","授权型 IssOrderNo")
                .authorize("授权型 AccessToken")
                .build();
        orderPlace(authorize);

        // 大商户型
        SsOrderPlaceDTO business = new SsOrderPlaceDTO
                .Builder("大商户型 ClientId","大商户型 IssOrderNo")
                .bigBusiness("大商户型 ShopId")
                .build();
        orderPlace(business);

    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/133937.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!