建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。在构建过程的每个方法可以返回构建对象实现链式结构来构建。
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。
网友评论