美文网首页
建造者模式

建造者模式

作者: 樱花舞 | 来源:发表于2020-06-29 15:26 被阅读0次

    建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。在构建过程的每个方法可以返回构建对象实现链式结构来构建。

    1、例子:发送邮件

    发送邮件需要账号密码、发送人邮件地址、收件人地址、主题内容等,这些数据可以通过建造者模式来一步步构建完成到最后发送。
    引入依赖包:

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-email</artifactId>
        <version>1.5</version>
    </dependency>
    
    public class MailBuilder {
        private HtmlEmail htmlEmail = new HtmlEmail();
    
        /**
         * 邮件host
         *
         * @param hostName 不能为空
         * @return
         */
        public MailBuilder setHostName(String hostName) {
            htmlEmail.setHostName(hostName);
            return this;
        }
    
        /**
         * 发件人
         *
         * @param from 发件人地址 不能为空
         * @param name 发件人名称
         * @return
         * @throws EmailException
         */
        public MailBuilder setFrom(String from, String name) throws EmailException {
            htmlEmail.setFrom(from, name);
            return this;
        }
    
        /**
         * 发件人账号密码
         *
         * @param userName 不能为空
         * @param password 不能为空
         * @return
         */
        public MailBuilder setAuthentication(String userName, String password) {
            htmlEmail.setAuthentication(userName, password);
            return this;
        }
    
        /**
         * 收件人
         *
         * @param mails 邮件地址
         * @return
         * @throws EmailException
         */
        public MailBuilder addTo(String... mails) throws EmailException {
            if (mails != null && mails.length != 0) {
                htmlEmail.addTo(mails);
            }
            return this;
        }
    
        /**
         * 抄送
         *
         * @param mails 邮件地址
         * @return
         * @throws EmailException
         */
        public MailBuilder addCc(String... mails) throws EmailException {
            if (mails != null && mails.length != 0) {
                htmlEmail.addCc(mails);
            }
            return this;
        }
    
        /**
         * 密送
         *
         * @param mails 邮件地址
         * @return
         * @throws EmailException
         */
        public MailBuilder addBcc(String... mails) throws EmailException {
            if (mails != null && mails.length != 0) {
                htmlEmail.addBcc(mails);
            }
            return this;
        }
    
        /**
         * 主题
         *
         * @param subject
         * @return
         */
        public MailBuilder setSubject(String subject) {
            htmlEmail.setSubject(subject);
            return this;
        }
    
        /**
         * 文本内容
         *
         * @param msg
         * @return
         * @throws EmailException
         */
        public MailBuilder setTextMsg(String msg) throws EmailException {
            if (StringUtils.isNotEmpty(msg)) {
                htmlEmail.setTextMsg(msg);
            }
            return this;
        }
    
        /**
         * 添加附件
         *
         * @param url
         * @param name 带后缀
         * @param desc
         * @return
         * @throws EmailException
         */
        public MailBuilder setAttachment(URL url, String name, String desc) throws EmailException {
            if (url != null) {
                htmlEmail.attach(url, name, desc);
            }
            return this;
        }
    
        /**
         * 网页代码
         *
         * @param htmlMsg
         * @return
         * @throws EmailException
         */
        public MailBuilder setHtmlMsg(String htmlMsg) throws EmailException {
            if (StringUtils.isNotEmpty(htmlMsg)) {
                htmlEmail.setHtmlMsg(htmlMsg);
            }
            return this;
        }
    
        /**
         * 发送邮件
         *
         * @throws EmailException
         */
        public void send() throws EmailException {
            htmlEmail.send();
        }
    }
    

    使用例子:

    MailBuilder mail = new MailBuilder();
            mail.setAuthentication("", "")
                    .setFrom("", "")
                    .setHostName("")
                    .addTo("")
                    .addBcc("")
                    .addCc("")
                    .setSubject("")
                    .setHtmlMsg("")
                    .setTextMsg("")
                    .setAttachment(new URL(""), "", "")
                    .send();
    

    在每个方法中都返回构建的对象,可以实现链式结构,但这链式有点多,虽然结构清晰,但也不美观了。需要注意的是,上面的例子是线程不安全的,不要用作spring 的bean。

    相关文章

      网友评论

          本文标题:建造者模式

          本文链接:https://www.haomeiwen.com/subject/riiofktx.html